結果
問題 | No.1606 Stuffed Animals Keeper |
ユーザー |
👑 ![]() |
提出日時 | 2023-03-02 00:56:29 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 52 ms / 3,000 ms |
コード長 | 1,131 bytes |
コンパイル時間 | 1,387 ms |
コンパイル使用メモリ | 117,036 KB |
最終ジャッジ日時 | 2025-02-11 00:52:55 |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 48 |
ソースコード
#include<iostream> #include<vector> #include<unordered_set> #include<unordered_map> #include<cmath> #include <algorithm> #include <random> using namespace std; using ll = long long; #define REP(i, n) for(ll i=0; i<(n);i++) #define VL vector<ll> std::random_device seed_gen; std::default_random_engine eg(seed_gen()); int main() { ll n; cin >> n; VL a(n); REP(i, n) cin >> a[i]; VL z, o; ll zc = 0, oc = 0; z.push_back(0); o.push_back(0); REP(i, n) { if (a[i] == 2) { z.push_back(0); o.push_back(0); } else if (a[i]) { o.back()++; oc++; } else { z.back()++; zc++; } } vector dp(z.size() + 1, vector<ll>(zc + oc + 1, 1e18)); dp[0][zc] = 0; REP(i, z.size()) { REP(j, zc+oc+1) { if (j + o[i] < zc + oc + 1) { dp[i + 1][j + o[i]] = min(dp[i + 1][j + o[i]], dp[i][j] + z[i]); } if (j - z[i] >= 0) { dp[i + 1][j - z[i]] = min(dp[i + 1][j - z[i]], dp[i][j] + o[i]); } } } if (dp[z.size()][oc] > 1e17) { cout << -1; } else { cout << dp[z.size()][oc] / 2; } return 0; }