#include <iostream>
#include <vector>
#include <string>
#include <map>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int t, n, ans;
string s;
map <int, int> M2, M1;
cin >>t;
for (int X=0; X<t; X++)
{
M1.clear();
M2.clear();
cin>>n>>s;
int sus = 0, based = 0;
int i, tempx=0;
for (i = 0; i < n; i++)
{
if (s[i]=='0')
{
tempx++;
}
else
{
if (sus<2)
sus++;
if (tempx>0)
{
if (sus == 1)
{
M1[tempx]++;
}
else
{
M2[tempx]++;
}
}
tempx = 0;
}
}
if (sus > 0)
{
if (tempx >0)
M1[tempx]++;
}
else
{
cout<<0<<endl;
continue;
}
//trwa bardzo kr�tko. Generuje zestawy otoczonych podw�jnie jak i pojedynczo
int M1max;
int M2max;
while (!( M1.empty() && M2.empty() ))
{
auto M1max = (M1.empty()) ? 0 : M1.rbegin()->first;
auto M2max = (M2.empty()) ? 0 : M2.rbegin()->first;
if ((M1max*2)>=M2max)
{
based += (M1max);
M1[M1max]--;
if ((M1.rbegin()->second) <= 0)
M1.erase(M1max);
}
else
{
based++;
M2[M2max]--;
if(M2max>1)
M1[M2max-1]++;
if ((M2.rbegin()->second) <= 0)
M2.erase(M2max);
} //algorytm szczepiacy
map<int, int> M;
for (auto it = M1.begin(); it != M1.end(); it++) //algorytm zakazajacy
{
int y = it->first;
if(y > 1)
M[y-1] += (it->second);
}
M1 = M;
M.clear();
for (auto it = M2.begin(); it != M2.end(); it++)
{
int y = it->first;
if(y > 2)
M[y-2] += (it->second);
}
M2 = M;
}
cout << (n-based) << endl;
}
return 0;
}
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 | #include <iostream> #include <vector> #include <string> #include <map> using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int t, n, ans; string s; map <int, int> M2, M1; cin >>t; for (int X=0; X<t; X++) { M1.clear(); M2.clear(); cin>>n>>s; int sus = 0, based = 0; int i, tempx=0; for (i = 0; i < n; i++) { if (s[i]=='0') { tempx++; } else { if (sus<2) sus++; if (tempx>0) { if (sus == 1) { M1[tempx]++; } else { M2[tempx]++; } } tempx = 0; } } if (sus > 0) { if (tempx >0) M1[tempx]++; } else { cout<<0<<endl; continue; } //trwa bardzo kr�tko. Generuje zestawy otoczonych podw�jnie jak i pojedynczo int M1max; int M2max; while (!( M1.empty() && M2.empty() )) { auto M1max = (M1.empty()) ? 0 : M1.rbegin()->first; auto M2max = (M2.empty()) ? 0 : M2.rbegin()->first; if ((M1max*2)>=M2max) { based += (M1max); M1[M1max]--; if ((M1.rbegin()->second) <= 0) M1.erase(M1max); } else { based++; M2[M2max]--; if(M2max>1) M1[M2max-1]++; if ((M2.rbegin()->second) <= 0) M2.erase(M2max); } //algorytm szczepiacy map<int, int> M; for (auto it = M1.begin(); it != M1.end(); it++) //algorytm zakazajacy { int y = it->first; if(y > 1) M[y-1] += (it->second); } M1 = M; M.clear(); for (auto it = M2.begin(); it != M2.end(); it++) { int y = it->first; if(y > 2) M[y-2] += (it->second); } M2 = M; } cout << (n-based) << endl; } return 0; } |
English