#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; } |