#include <bits/stdc++.h> using namespace std; int n; bool t[100*1000+5]; int zwrocprzedzialzlewej(){ if (!t[0]){ int kon = 0; for (; kon<n;kon++){ if (t[kon]){ return kon; } } } return 0; } int zwrocprzedzialzprawej(){ if (!t[n-1]){ for (int i=0; i<n;i++){ if (t[n-1-i]){ return i; } } } return 0; } int symuluj(int czas, int wynik, vector <int> & p){ int k=p.size(); for (int i=0; i<k;i++){ if (p[i]-2*czas == 1){ czas++; wynik++; }else if (p[i]-2*czas >= 1){ wynik+=p[i]-2*czas-1; czas+=2; } } return wynik; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int z; cin >> z; for (int z2=0;z2<z;z2++){ cin >> n; for (int i=0; i<n;i++){ char tmp; cin >> tmp; t[i] = (tmp=='1'); } vector <int> przedzialy; int lpocz=-1; bool czy_wrz=1; bool czy_pierw=1; for (int i=0;i<n;i++){ if (t[i] && !czy_wrz && !czy_pierw){ if (i-lpocz-1>0){ przedzialy.push_back(i-lpocz-1); } } if (!t[i]){ czy_wrz = 0; } if (t[i]){ czy_pierw=0; lpocz=i; } } int k = przedzialy.size(); sort(przedzialy.begin(),przedzialy.end()); reverse(przedzialy.begin(),przedzialy.end()); /*for (int i=0;i<k;i++){ cout << przedzialy[i].first << " "<<przedzialy[i].second<<endl; } cout << endl;*/ int wynik=0; int czas=0; wynik=symuluj(0,0,przedzialy); int lewy=zwrocprzedzialzlewej(); int prawy=zwrocprzedzialzprawej(); if (lewy>0){ wynik=max(symuluj(1,lewy,przedzialy),wynik); } if (prawy>0){ wynik=max(symuluj(1,prawy,przedzialy),wynik); } if (lewy>0 && prawy>0){ wynik=max(symuluj(2,prawy+lewy-1,przedzialy),wynik); } bool czek=0; for (int i=0; i<n;i++){ if (t[i]==0){ czek=1; } } if (!czek){ wynik=0; } czek=0; for (int i=0; i<n;i++){ if (t[i]==1){ czek=1; } } if (!czek){ wynik=n; } cout <<n-wynik<<endl; } }
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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | #include <bits/stdc++.h> using namespace std; int n; bool t[100*1000+5]; int zwrocprzedzialzlewej(){ if (!t[0]){ int kon = 0; for (; kon<n;kon++){ if (t[kon]){ return kon; } } } return 0; } int zwrocprzedzialzprawej(){ if (!t[n-1]){ for (int i=0; i<n;i++){ if (t[n-1-i]){ return i; } } } return 0; } int symuluj(int czas, int wynik, vector <int> & p){ int k=p.size(); for (int i=0; i<k;i++){ if (p[i]-2*czas == 1){ czas++; wynik++; }else if (p[i]-2*czas >= 1){ wynik+=p[i]-2*czas-1; czas+=2; } } return wynik; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int z; cin >> z; for (int z2=0;z2<z;z2++){ cin >> n; for (int i=0; i<n;i++){ char tmp; cin >> tmp; t[i] = (tmp=='1'); } vector <int> przedzialy; int lpocz=-1; bool czy_wrz=1; bool czy_pierw=1; for (int i=0;i<n;i++){ if (t[i] && !czy_wrz && !czy_pierw){ if (i-lpocz-1>0){ przedzialy.push_back(i-lpocz-1); } } if (!t[i]){ czy_wrz = 0; } if (t[i]){ czy_pierw=0; lpocz=i; } } int k = przedzialy.size(); sort(przedzialy.begin(),przedzialy.end()); reverse(przedzialy.begin(),przedzialy.end()); /*for (int i=0;i<k;i++){ cout << przedzialy[i].first << " "<<przedzialy[i].second<<endl; } cout << endl;*/ int wynik=0; int czas=0; wynik=symuluj(0,0,przedzialy); int lewy=zwrocprzedzialzlewej(); int prawy=zwrocprzedzialzprawej(); if (lewy>0){ wynik=max(symuluj(1,lewy,przedzialy),wynik); } if (prawy>0){ wynik=max(symuluj(1,prawy,przedzialy),wynik); } if (lewy>0 && prawy>0){ wynik=max(symuluj(2,prawy+lewy-1,przedzialy),wynik); } bool czek=0; for (int i=0; i<n;i++){ if (t[i]==0){ czek=1; } } if (!czek){ wynik=0; } czek=0; for (int i=0; i<n;i++){ if (t[i]==1){ czek=1; } } if (!czek){ wynik=n; } cout <<n-wynik<<endl; } } |