結果
問題 |
No.1715 Dinner 2
|
ユーザー |
![]() |
提出日時 | 2021-11-14 23:02:12 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,294 ms / 2,000 ms |
コード長 | 1,105 bytes |
コンパイル時間 | 198 ms |
コンパイル使用メモリ | 82,100 KB |
実行使用メモリ | 280,080 KB |
最終ジャッジ日時 | 2024-11-30 09:04:51 |
合計ジャッジ時間 | 15,523 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 38 |
ソースコード
from sys import stdin n, d, *indata = map(int, stdin.read().split()) offset = 0 p = [] q = [] for i in range(n): s, t = indata[offset + 2*i],indata[offset + 2*i+1] p.append(s) q.append(t) largenum = -10**9 left = -10**8 right = 0 while (right - left) >= 2: mid = (right + left) // 2 dp = [[largenum for i in range(n)] for j in range(d)] for i in range(n): if -p[i] >= mid: dp[0][i] = q[i] - p[i] for i in range(1,d): ruisekileft = [largenum for i in range(n+1)] ruisekiright = [largenum for i in range(n+1)] for j in range(n): ruisekileft[j+1] = max(ruisekileft[j],dp[i-1][j]) ruisekiright[j+1] = max(ruisekiright[j],dp[i-1][n-j-1]) for j in range(n): kari = max(ruisekileft[j],ruisekiright[n-j-1]) if kari - p[j] >= mid: dp[i][j] = kari + q[j] - p[j] check = False for i in range(n): if dp[d-1][i] != largenum: check = True break if check: left = mid else: right = mid print("{}".format(left))