結果
| 問題 | No.3683 サーバー代がもったいない! |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-07-31 18:33:40 |
| 言語 | PyPy3 (7.3.23) |
| 結果 |
AC
|
| 実行時間 | 237 ms / 2,000 ms |
| + 357µs | |
| コード長 | 1,491 bytes |
| 記録 | |
| コンパイル時間 | 232 ms |
| コンパイル使用メモリ | 95,940 KB |
| 実行使用メモリ | 99,968 KB |
| 最終ジャッジ日時 | 2026-09-05 12:45:08 |
| 合計ジャッジ時間 | 6,662 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge2_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 27 |
ソースコード
import sys
def main():
# 入力の一括読み込み(C++のcinの高速化に相当)
input_data = sys.stdin.read().split()
if not input_data:
return
n = int(input_data[0])
k = int(input_data[1])
a = [int(x) for x in input_data[2:2+n]]
# 自明な不可能判定
# N個の数列から隣接せずに選べる最大個数は (N + 1) // 2 個
if k > (n + 1) // 2:
print("Impossible")
return
INF = 10**18
# dp[j][flag]
# j: 選んだ個数 (0 <= j <= k)
# flag: 直前の要素を選んだか (0: 選んでいない, 1: 選んだ)
dp = [[-INF] * 2 for _ in range(k + 1)]
dp[0][0] = 0
for i in range(n):
next_dp = [[-INF] * 2 for _ in range(k + 1)]
for j in range(k + 1):
# 【遷移1】i番目の要素を削除(選ばない)場合
# 前回選んでいても、いなくてもよいので、大きい方を引き継ぐ
next_dp[j][0] = max(dp[j][0], dp[j][1])
# 【遷移2】i番目の要素を選ぶ場合
# 「前回選んでいない状態(dp[j-1][0])」からしか遷移できない
if j > 0 and dp[j - 1][0] != -INF:
next_dp[j][1] = dp[j - 1][0] + a[i]
# テーブルを更新
dp = next_dp
# 答えは N 番目まで見て K 個選んだ状態の最大値
ans = max(dp[k][0], dp[k][1])
print(ans)
if __name__ == '__main__':
main()