#include <iostream> #include <queue> #include <string> using namespace std; int main() { string line; int t, n, left, right, zeros=0, days = 0, alive = 0, current; bool getNew = false; priority_queue<int> pq; cin>>t; for(int i=0; i<t; i++) { zeros = 0; left = right = -1; cin>>n; cin>>line; for (int j=0; j<n; j++) { if (line[j] == '0') { zeros++; } else { if (left == -1) { left = zeros; } else if (zeros > 0) { pq.push(zeros); } zeros = 0; } } if (zeros > 0) { right = zeros; } getNew = true; current = -1; days = 0; alive = 0; while (!pq.empty()) { if (getNew) { current = pq.top() - days; pq.pop(); } if (current > left && current > right && current > 0) { if (current > 3) { alive = alive + current - 1; days += 4; left -= 2; right -= 2; } else if (current == 3) { if (left == 2 || right == 2) { alive += 3; left = right = -1; current =-1; break; } else { alive += 2; left = right = -1; current =-1; break; } } else if (current > 0) { alive++; days++; left = right = -1; current =-1; break; } else { current =-1; break; } getNew = true; } else if (left >= current && left > right && left > 0) { alive += left; days += 2; current -= 2; right--; left = -1; getNew = false; } else if (right > 0) { alive += right; days += 2; current -= 2; left--; right = -1; getNew = false; } else { getNew = true; } } if (!getNew && current >0 && current <= 2) { alive++; } else if (!getNew && current > 2) { alive = alive + current -1; } if (left > 0 && left > right) { alive += left; right--; } if (right > 0) { alive += right; } pq = priority_queue <int>(); cout<<n-alive<<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 | #include <iostream> #include <queue> #include <string> using namespace std; int main() { string line; int t, n, left, right, zeros=0, days = 0, alive = 0, current; bool getNew = false; priority_queue<int> pq; cin>>t; for(int i=0; i<t; i++) { zeros = 0; left = right = -1; cin>>n; cin>>line; for (int j=0; j<n; j++) { if (line[j] == '0') { zeros++; } else { if (left == -1) { left = zeros; } else if (zeros > 0) { pq.push(zeros); } zeros = 0; } } if (zeros > 0) { right = zeros; } getNew = true; current = -1; days = 0; alive = 0; while (!pq.empty()) { if (getNew) { current = pq.top() - days; pq.pop(); } if (current > left && current > right && current > 0) { if (current > 3) { alive = alive + current - 1; days += 4; left -= 2; right -= 2; } else if (current == 3) { if (left == 2 || right == 2) { alive += 3; left = right = -1; current =-1; break; } else { alive += 2; left = right = -1; current =-1; break; } } else if (current > 0) { alive++; days++; left = right = -1; current =-1; break; } else { current =-1; break; } getNew = true; } else if (left >= current && left > right && left > 0) { alive += left; days += 2; current -= 2; right--; left = -1; getNew = false; } else if (right > 0) { alive += right; days += 2; current -= 2; left--; right = -1; getNew = false; } else { getNew = true; } } if (!getNew && current >0 && current <= 2) { alive++; } else if (!getNew && current > 2) { alive = alive + current -1; } if (left > 0 && left > right) { alive += left; right--; } if (right > 0) { alive += right; } pq = priority_queue <int>(); cout<<n-alive<<endl; } } |