結果
| 問題 |
No.448 ゆきこーだーの雨と雪 (3)
|
| ユーザー |
mkawa2
|
| 提出日時 | 2020-04-25 18:24:44 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,298 bytes |
| コンパイル時間 | 399 ms |
| コンパイル使用メモリ | 12,672 KB |
| 実行使用メモリ | 81,104 KB |
| 最終ジャッジ日時 | 2024-11-07 12:41:56 |
| 合計ジャッジ時間 | 14,636 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 28 WA * 7 |
ソースコード
import sys
sys.setrecursionlimit(10 ** 6)
def MI(): return map(int, sys.stdin.readline().split())
def LI(): return list(map(int, sys.stdin.readline().split()))
def LLI(rows_number): return [LI() for _ in range(rows_number)]
def main():
def ok(m):
pt=-inf
mxd=dd[m]
# Ameの最大難易度をmxdとする
# Yukiに振る仕事(難易度がmxdより大きい仕事)だけをみたとき
# 時間の間隔がk以上空いているかチェックする
for t,d in td:
if d<=mxd:continue
if t-pt<k:return False
pt=t
return True
inf=10**10
n,k=MI()
td=LLI(n)
# Ameの難易度最大値を二分探索
dd=[0]+sorted(set(d for t,d in td))
#print(dd)
l=-1
r=len(dd)
while l+1<r:
m=(l+r)//2
if ok(m):r=m
else:l=m
mxd=dd[r]
print(mxd)
if r==0:
print(0)
exit()
# Ameの最大難易度mxd以内の仕事のうち、Yukiに渡せるものをできるだけ渡す
# Yukiの確定している仕事時刻を集計
ytt=[t for t,d in td if d>mxd]
# Ameの仕事のうち、Yukiの仕事から時間がk以上離れているものを集める
# ついでにAmeの難易度合計totも計算
tot=0
i=0
cando=[]
for t,d in td:
if d>mxd:continue
tot+=d
while i<len(ytt)-1 and t>ytt[i]+k:i+=1
if abs(t-ytt[i])>=k:cando.append((t,d))
# candoの中から、AmeからYukiに渡す仕事の難易度合計の最大値mxを求める
# DPみたいな感じで
# 時間順に見ていって、k時間以上前の最大難易度premaxに今の難易度を足していく
premax=0
# 処理の終わった、時刻と合計難易度をttとsdに入れていく
tt=[-inf]
sd=[0]
mx=0
for t,d in cando:
# 時刻tからk以上離れている合計難易度の最大値を作る
while i<len(tt) and tt[i]<=t-k:
premax=max(premax,sd[i])
i+=1
# この仕事をやるときの最大難易度cur
cur=premax+d
tt.append(t)
sd.append(cur)
mx=max(mx,cur)
# totのうちmxをYukiに渡すので、引き算するとAmeの難易度合計
print(tot-mx)
main()
mkawa2