//Tadeusz Kielak #include <bits/stdc++.h> //#define TEST using namespace std; #define FAST ios_base::sync_with_stdio(0) ;cin.tie(0); #define pb push_back void przekierowanie() { #ifdef TEST freopen( "input.txt", "r", stdin ); freopen( "output.txt", "w", stdout ); #endif } void task() { long n; cin >> n; string ciag; cin >> ciag; vector <long> brzegowe; vector <long> srodkowe; long i = 0; if( ciag[ 0 ] == '0') { while( i < n && ciag[ i ] == '0' ) i ++; brzegowe.pb( i ); } long j = i; while( i < n ) { while( ciag[ i ] == '1' ) i ++; j = i; if( i < n ) { while( i < n && ciag[ i ] == '0' ) i ++; if( i == n ) brzegowe.pb( i - j); else srodkowe.pb( i - j); } } long zdrowe = 0; sort( srodkowe.begin(), srodkowe.end(), [](long a, long b) { return b < a; }) ; sort( brzegowe.begin(), brzegowe.end(), [](long a, long b) { return b < a; }); auto l_brzegowych = brzegowe.size(); auto l_srodkowych = srodkowe.size(); long brzeg_index = 0; long srodek_index = 0; long z_b = 0; long z_s = 0; while ( brzeg_index < l_brzegowych || srodek_index < l_srodkowych ) { long brzeg_wartosc = -1; long srodek_wartosc = -1; if( brzeg_index < l_brzegowych ) brzeg_wartosc = brzegowe[ brzeg_index ]; if( srodek_index < l_srodkowych ) srodek_wartosc = srodkowe[ srodek_index ]; if( brzeg_wartosc < 0 || srodek_wartosc - ( (z_b * 2) + ( z_s * 4 ) )> brzeg_wartosc - ( z_b + z_s * 2 ) + 2) { srodek_wartosc -= (z_b * 2) + ( z_s * 4 ); if( srodek_wartosc > 1 ) srodek_wartosc -= 1; if( srodek_wartosc > 0) { z_s ++; zdrowe += srodek_wartosc; } srodek_index ++; } else { brzeg_wartosc -= z_b + z_s * 2; if( brzeg_wartosc > 0) { z_b ++; zdrowe += brzeg_wartosc; } brzeg_index ++; } } cout << n - zdrowe << '\n'; } int main() { FAST przekierowanie(); long t; cin >> t; while( t -- ) task(); 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 | //Tadeusz Kielak #include <bits/stdc++.h> //#define TEST using namespace std; #define FAST ios_base::sync_with_stdio(0) ;cin.tie(0); #define pb push_back void przekierowanie() { #ifdef TEST freopen( "input.txt", "r", stdin ); freopen( "output.txt", "w", stdout ); #endif } void task() { long n; cin >> n; string ciag; cin >> ciag; vector <long> brzegowe; vector <long> srodkowe; long i = 0; if( ciag[ 0 ] == '0') { while( i < n && ciag[ i ] == '0' ) i ++; brzegowe.pb( i ); } long j = i; while( i < n ) { while( ciag[ i ] == '1' ) i ++; j = i; if( i < n ) { while( i < n && ciag[ i ] == '0' ) i ++; if( i == n ) brzegowe.pb( i - j); else srodkowe.pb( i - j); } } long zdrowe = 0; sort( srodkowe.begin(), srodkowe.end(), [](long a, long b) { return b < a; }) ; sort( brzegowe.begin(), brzegowe.end(), [](long a, long b) { return b < a; }); auto l_brzegowych = brzegowe.size(); auto l_srodkowych = srodkowe.size(); long brzeg_index = 0; long srodek_index = 0; long z_b = 0; long z_s = 0; while ( brzeg_index < l_brzegowych || srodek_index < l_srodkowych ) { long brzeg_wartosc = -1; long srodek_wartosc = -1; if( brzeg_index < l_brzegowych ) brzeg_wartosc = brzegowe[ brzeg_index ]; if( srodek_index < l_srodkowych ) srodek_wartosc = srodkowe[ srodek_index ]; if( brzeg_wartosc < 0 || srodek_wartosc - ( (z_b * 2) + ( z_s * 4 ) )> brzeg_wartosc - ( z_b + z_s * 2 ) + 2) { srodek_wartosc -= (z_b * 2) + ( z_s * 4 ); if( srodek_wartosc > 1 ) srodek_wartosc -= 1; if( srodek_wartosc > 0) { z_s ++; zdrowe += srodek_wartosc; } srodek_index ++; } else { brzeg_wartosc -= z_b + z_s * 2; if( brzeg_wartosc > 0) { z_b ++; zdrowe += brzeg_wartosc; } brzeg_index ++; } } cout << n - zdrowe << '\n'; } int main() { FAST przekierowanie(); long t; cin >> t; while( t -- ) task(); return 0; } |