結果
問題 | 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;}