Submission #794286

#TimeUsernameProblemLanguageResultExecution timeMemory
794286puppyFlip it and Stick it (CCO23_day2problem1)C++17
25 / 25
6 ms2216 KiB
#include <iostream> #include <string> #include <algorithm> #include <vector> #include <numeric> #include <ctime> #include <cstdlib> using namespace std; string s, t; void flip(string &s) { for (int i = 0; i < (int)s.size(); i++) { s[i] = s[i] == '0' ? '1' : '0'; } } int minimum_cost(vector<int> v) { int zr = accumulate(v.begin(), v.end(), 0), on = (int)v.size() - 1; if (zr > 2 * (on + 1)) return -1; int one = 0, zero = 0; vector<int> up; for (int i:v) { if (i == 1) one++; else if (i == 0) zero++; else if (i >= 3) up.push_back(i); } int req_one = 0; for (int &i:up) { if (i % 2 == 1) { req_one++; i--; } } int ans = 0; ans += req_one; if (one > req_one) { one -= req_one; } else { req_one -= one; one = 0; zero -= (req_one + 1) / 2; } int req_ev = 0; for (int i:up) req_ev += (i - 2) / 2; if (req_ev <= zero) { ans += req_ev; } else { ans += zero; req_ev -= zero; ans += req_ev * 2; } return ans; } int main() { cin >> s >> t; int n = s.size(); int k = t.size(); if (k == 1) { bool ouc[2]; for (int i = 0; i < n; i++) ouc[s[i]-'0'] = true; if (ouc[t[0]-'0']) cout << -1; else cout << 0; } else if (k == 2) { if (t[0] != t[1]) { if (t[0] == '1') flip(s); int ans = 0; for (int i = n - 1; i >= 0; i--) { if (s[i] == '1') continue; while (i > 0 && s[i-1] == '0') --i; ans++; } if (s[n-1] == '0') --ans; cout << ans; } else { if (t[0] == '1') flip(s); int ans = 0; int cnt = 0; for (int i = 0; i < n; i++) cnt += s[i] == '0'; if (cnt > (n+1)/2) cout << -1; else { for (int i = 0; i < n; i++) { if (s[i] == '1') continue; int l = i; while (i + 1 < n && s[i] == s[i+1]) i++; int r = i; ans += r - l; } cout << ans; } } } else { if (t[0] != t[2]) { if (t[0] == '1') { flip(s); flip(t); } if (t[1] == '1') { t[1] = '0'; flip(s); reverse(s.begin(), s.end()); } int cnt = 0; int st = n - 1; while (st >= 0 && s[st] == '0') st--; for (int i = st; i >= 0; i--) { if (s[i] == '1') continue; int l = i; while (i > 0 && s[i-1] == '0') i--; int r = i; cnt += l - r >= 1; } cout << cnt; } else if (t[0] != t[1]) { if (t[0] == '1') flip(s); int cnt = 0; for (int i = 1; i < n - 1; i++) { if (s[i-1] == '0' && s[i] == '1' && s[i+1] == '0') cnt++; } cout << (cnt + 1) / 2; } else { if (t[0] == '1') flip(s); vector<int> v; for (int i = 0; i < n; i++) { if (s[i] == '1') continue; int l = i; while (i < n - 1 && s[i+1] == '0') i++; int r = i; v.push_back(r - l + 1); } for (int i = 0; i < n - 1; i++) { if (s[i] == '1' && s[i+1] == '1') v.push_back(0); } if (s[0] == '1') v.push_back(0); if (s[n-1] == '1') v.push_back(0); cout << minimum_cost(v); } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...