結果
問題 | No.1536 仕切り直し |
ユーザー |
![]() |
提出日時 | 2021-06-06 18:42:40 |
言語 | Crystal (1.14.0) |
結果 |
AC
|
実行時間 | 98 ms / 2,000 ms |
コード長 | 1,274 bytes |
コンパイル時間 | 12,499 ms |
コンパイル使用メモリ | 296,496 KB |
実行使用メモリ | 62,108 KB |
最終ジャッジ日時 | 2024-11-25 06:35:34 |
合計ジャッジ時間 | 12,522 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 10 |
ソースコード
n, m = read_line.split.map(&.to_i)a = read_line.split.map(&.to_i).reversedp_max = Array.new(n + 1) { Array.new(m + 1, -(1i64 << 58)) }dp_min = Array.new(n + 1) { Array.new(m + 1, (1i64 << 58)) }use_max = Array.new(n + 1) { Array.new(m + 1, false) }use_min = Array.new(n + 1) { Array.new(m + 1, false) }dp_max[0][0] = 0dp_min[0][0] = 0n.times do |i|0.upto(m) do |j|if dp_max[i + 1][j] < dp_max[i][j] + a[i]dp_max[i + 1][j] = dp_max[i][j] + a[i]use_max[i + 1][j] = falseendif j < m && dp_min[i + 1][j + 1] > -dp_max[i][j] - a[i]dp_min[i + 1][j + 1] = -dp_max[i][j] - a[i]use_min[i + 1][j + 1] = trueendif j < m && dp_max[i + 1][j + 1] < -dp_min[i][j] - a[i]dp_max[i + 1][j + 1] = -dp_min[i][j] - a[i]use_max[i + 1][j + 1] = trueendif dp_min[i + 1][j] > dp_min[i][j] + a[i]dp_min[i + 1][j] = dp_min[i][j] + a[i]use_min[i + 1][j] = falseendendendmi = 0mv = 0i640.upto(m) do |i|if dp_max[n][i] > mvmi = imv = dp_max[n][i]endendans = [] of Int32cur_max = truen.downto(1) do |i|use = cur_max ? use_max : use_minif use[i][mi]ans << n - imi -= 1cur_max = !cur_maxendendwhile ans.size < mans << nendputs ans.join("\n")