#include <stdio.h>
#include <vector>
#include <queue>
#include <algorithm>
char line[1000000];
void one_case(){
int n;
scanf("%d", &n);
scanf("%s", line);
std::priority_queue<int> srodek;
std::priority_queue<int> brzegi;
int ostatniChory = -1;
for (int i = 0; i < n; i++){
if (line[i] == '1'){
if (ostatniChory + 1 < i) {
if (ostatniChory == -1){
brzegi.push(i);
} else {
srodek.push(i - ostatniChory - 1);
}
}
ostatniChory = i;
} else if (i == n - 1){
brzegi.push(i - ostatniChory);
}
}
int zasz = 0;
int krok = 0;
while(1){
int sr = srodek.empty() ? -1 : srodek.top();
int br = brzegi.empty() ? -1 : brzegi.top();
sr = sr - krok * 2;
br = br - krok;
if (sr <= 0 && br <= 0){
break;
}
if (br * 2 >= sr){//w tym wariancie zawiera sie tez sytuacja gdize mamy 3ke srodkowa i 2ke zewnetrzna
zasz += br;
brzegi.pop();
} else {
int konwertowany = srodek.top() - krok - 1;
brzegi.push(konwertowany); //robimy tak by zostala zachowana kompatybilnosc
srodek.pop();
++zasz;//podczas konwersji jednego zaszczepiamy
}
++krok;
}
printf("%d\n", n - zasz);
}
int main(){
int c;
scanf("%d", &c);
for(int i = 0; i < c; ++i){
one_case();
}
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 | #include <stdio.h> #include <vector> #include <queue> #include <algorithm> char line[1000000]; void one_case(){ int n; scanf("%d", &n); scanf("%s", line); std::priority_queue<int> srodek; std::priority_queue<int> brzegi; int ostatniChory = -1; for (int i = 0; i < n; i++){ if (line[i] == '1'){ if (ostatniChory + 1 < i) { if (ostatniChory == -1){ brzegi.push(i); } else { srodek.push(i - ostatniChory - 1); } } ostatniChory = i; } else if (i == n - 1){ brzegi.push(i - ostatniChory); } } int zasz = 0; int krok = 0; while(1){ int sr = srodek.empty() ? -1 : srodek.top(); int br = brzegi.empty() ? -1 : brzegi.top(); sr = sr - krok * 2; br = br - krok; if (sr <= 0 && br <= 0){ break; } if (br * 2 >= sr){//w tym wariancie zawiera sie tez sytuacja gdize mamy 3ke srodkowa i 2ke zewnetrzna zasz += br; brzegi.pop(); } else { int konwertowany = srodek.top() - krok - 1; brzegi.push(konwertowany); //robimy tak by zostala zachowana kompatybilnosc srodek.pop(); ++zasz;//podczas konwersji jednego zaszczepiamy } ++krok; } printf("%d\n", n - zasz); } int main(){ int c; scanf("%d", &c); for(int i = 0; i < c; ++i){ one_case(); } return 0; } |
English