結果
| 問題 |
No.489 株に挑戦
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2017-03-26 22:16:57 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,364 bytes |
| コンパイル時間 | 116 ms |
| コンパイル使用メモリ | 12,928 KB |
| 実行使用メモリ | 25,728 KB |
| 最終ジャッジ日時 | 2024-07-06 06:34:43 |
| 合計ジャッジ時間 | 5,148 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 30 WA * 5 |
ソースコード
import collections
def read_data():
N, D, K = map(int, input().split())
xs = []
for n in range(N):
xs.append(int(input()))
return N, D, K, xs
def solve(N, D, K, xs):
maxval, first, last = solve_core(N, D, xs)
if maxval:
print(maxval * K)
print(first, last)
else:
print(0)
def slide_min(Vs, w):
'''ウインドウ幅 w でのスライド最小値のリストを返す。
引数
Vs: 数列
w: スライド幅を表す整数。w = 0 ならば、Vs を返す。w = 1 ならば、Vs[i] と Vs[i-1]のうち小さい方の入ったリストを返す。
返り値
Ms: Ms[i] = min(Vs[i-w:i+1]) を満たすリスト
'''
N = len(Vs)
dq = collections.deque()
Ms = [float('inf')] * N
for i, v in enumerate(Vs):
if dq:
while dq and dq[-1][1] >= v:
dq.pop()
dq.append((i, v))
if dq[0][0] + w < i:
dq.popleft()
pos, val = dq[0]
Ms[i] = val
return Ms
def solve_core(N, D, xs):
Ms = slide_min(xs, D)
Bs = [x - m for m, x in zip(Ms, xs)]
b = max(Bs)
sell = Bs.index(b)
m = xs[sell] - b
for p in range(max(sell - D, 0), sell + 1):
if Ms[p] == m:
buy = p
break
return b, buy, sell
N, D, K, xs = read_data()
solve(N, D, K, xs)