#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> m2;
int foo(int emin, int emax) {
int cycle = 0, one_spare = 0, saved=0;
if(emax == 0){}
else if(emax == 1){
one_spare = 1;
}
else if(emin <= 1 && emax >= 2){
cycle = 1;
saved = emax;
}
else if(emin == 2 && emax >= 2){
cycle = 1;
saved = emax;
one_spare = 1;
}
else {
cycle = 2;
saved = emax + emin - 1;
}
if(m2.size() == 0 || m2[0] - 2*cycle <= 0)
{
if(one_spare == 1) saved++;
}
else
for (int i = 0; i < m2.size(); i++)
{
int a = m2[i] - 2*cycle;
if(a <= 0){
break;
}
else if(a == 1 || a == 2) {
saved += 1;
break;
}
else {
saved += a - 1;
cycle += 2;
}
}
return saved;
}
void run_tc(){
int n;
cin >> n;
int mc=0;
vector<int> m;
for (int i = 0; i < n; i++)
{
char t;
cin >> t;
if(t == '0'){
mc++;
}
else{
m.push_back(mc);
mc = 0;
}
}
m.push_back(mc);
if(m.size() == 1){
cout << "0\n";
return;
}
int emax = max(m.front(), m.back());
int emin = min(m.front(), m.back());
m2.clear();
copy_if(m.begin()+1, m.end()-1, back_inserter(m2), [](int i){return i != 0;});
sort(m2.begin(), m2.end());
reverse(m2.begin(), m2.end());
int a = foo(emin, emax);
int b = foo(0, emax);
int c = foo(0, 0);
int saved = max(a, max(b,c));
cout << n-saved << '\n';
}
int main()
{
int t;
cin >> t;
for (int i = 0; i < t; i++)
{
run_tc();
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | #include <iostream> #include <vector> #include <algorithm> using namespace std; vector<int> m2; int foo(int emin, int emax) { int cycle = 0, one_spare = 0, saved=0; if(emax == 0){} else if(emax == 1){ one_spare = 1; } else if(emin <= 1 && emax >= 2){ cycle = 1; saved = emax; } else if(emin == 2 && emax >= 2){ cycle = 1; saved = emax; one_spare = 1; } else { cycle = 2; saved = emax + emin - 1; } if(m2.size() == 0 || m2[0] - 2*cycle <= 0) { if(one_spare == 1) saved++; } else for (int i = 0; i < m2.size(); i++) { int a = m2[i] - 2*cycle; if(a <= 0){ break; } else if(a == 1 || a == 2) { saved += 1; break; } else { saved += a - 1; cycle += 2; } } return saved; } void run_tc(){ int n; cin >> n; int mc=0; vector<int> m; for (int i = 0; i < n; i++) { char t; cin >> t; if(t == '0'){ mc++; } else{ m.push_back(mc); mc = 0; } } m.push_back(mc); if(m.size() == 1){ cout << "0\n"; return; } int emax = max(m.front(), m.back()); int emin = min(m.front(), m.back()); m2.clear(); copy_if(m.begin()+1, m.end()-1, back_inserter(m2), [](int i){return i != 0;}); sort(m2.begin(), m2.end()); reverse(m2.begin(), m2.end()); int a = foo(emin, emax); int b = foo(0, emax); int c = foo(0, 0); int saved = max(a, max(b,c)); cout << n-saved << '\n'; } int main() { int t; cin >> t; for (int i = 0; i < t; i++) { run_tc(); } } |
English