結果
問題 | No.1606 Stuffed Animals Keeper |
ユーザー | merom686 |
提出日時 | 2021-07-16 22:24:56 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 7 ms / 3,000 ms |
コード長 | 966 bytes |
コンパイル時間 | 2,004 ms |
コンパイル使用メモリ | 198,028 KB |
最終ジャッジ日時 | 2025-01-23 02:15:58 |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 48 |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; int main() { int n; cin >> n; vector<int> a(n); int s = 0; for (int i = 0; i < n; i++) { cin >> a[i]; s += a[i] == 0; } a.push_back(2); vector<array<int, 2>> p; array<int, 2> t = {}; for (int i = 0; i <= n; i++) { if (a[i] == 2) { if (t[0] + t[1] > 0) { p.push_back(t); t = {}; } } else { t[a[i]]++; } } int dp[5001];//0の個数がkのときの最小コスト for (int k = 0; k <= s; k++) { dp[k] = 1 << 20; } dp[0] = 0; for (const auto &t : p) { for (int k = s; k >= 0; k--) { dp[k] += t[0]; if (int k1 = k - (t[0] + t[1]); k1 >= 0) dp[k] = min(dp[k], dp[k1] + t[1]); } } int r = dp[s] / 2; if (dp[s] >= 1 << 20) r = -1; cout << r << endl; return 0; }