//Autor:Szymon Nowak
#include <iostream>
using namespace std;
void quicksort(int* tablica, int lewy, int prawy,int* d)
{
int v=tablica[(lewy+prawy)/2];
int i,j,x;
i=lewy;
j=prawy;
do
{
while (tablica[i]<v) i++;
while (tablica[j]>v) j--;
if (i<=j)
{
swap(tablica[i],tablica[j]);
swap(d[i],d[j]);
i++;
j--;
}
}
while (i<=j);
if (j>lewy) quicksort(tablica,lewy, j,d);
if (i<prawy) quicksort(tablica, i, prawy,d);
}
void rozprzestrzenianie(int *strony_zarazania,int *ile_zer,int y)
{
for(int i=0;i<=y;i++)
{
if(ile_zer[i]<strony_zarazania[i]) {strony_zarazania[i]=0; ile_zer[i]=0;}
ile_zer[i]-=strony_zarazania[i];
}
}
const int MAX=1e5+10;
int ile_zer[MAX];
int strony_zarazania[MAX];
char tablica[MAX];
int main()
{
int t;
cin>>t;
for(int i=1;i<=t;i++)
{
int n;
cin>>n;
for(int j=0;j<n;j++)
{
cin>>tablica[j];
ile_zer[j]=0;
}
int y=-1;
int x=0;
while(x<n)
{
if(tablica[x]=='0')
{
y++;
while(tablica[x]=='0' && x<n)
{
ile_zer[y]+=1;
x++;
}
}
x++;
}
for(int j=0;j<n;j++) strony_zarazania[j]=2;
if(tablica[0]!='1') strony_zarazania[0]=1;
if(tablica[n-1]!='1') strony_zarazania[y]=1;
int z=y;
int suma_zarazaczy;
for(int i=0;i<=y;i++) suma_zarazaczy+=strony_zarazania[i];
while(suma_zarazaczy!=0)
{
z=y;
quicksort(ile_zer,0,y,strony_zarazania);
while(strony_zarazania[z]==0 && z>=0) z--;
strony_zarazania[z]-=1;
rozprzestrzenianie(strony_zarazania,ile_zer,y);
suma_zarazaczy=0;
for(int i=0;i<=y;i++) suma_zarazaczy+=strony_zarazania[i];
}
int suma=0;
for(int i=0;i<=y;i++) suma+=ile_zer[i];
cout<<n-suma<<"\n";
}
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 | //Autor:Szymon Nowak #include <iostream> using namespace std; void quicksort(int* tablica, int lewy, int prawy,int* d) { int v=tablica[(lewy+prawy)/2]; int i,j,x; i=lewy; j=prawy; do { while (tablica[i]<v) i++; while (tablica[j]>v) j--; if (i<=j) { swap(tablica[i],tablica[j]); swap(d[i],d[j]); i++; j--; } } while (i<=j); if (j>lewy) quicksort(tablica,lewy, j,d); if (i<prawy) quicksort(tablica, i, prawy,d); } void rozprzestrzenianie(int *strony_zarazania,int *ile_zer,int y) { for(int i=0;i<=y;i++) { if(ile_zer[i]<strony_zarazania[i]) {strony_zarazania[i]=0; ile_zer[i]=0;} ile_zer[i]-=strony_zarazania[i]; } } const int MAX=1e5+10; int ile_zer[MAX]; int strony_zarazania[MAX]; char tablica[MAX]; int main() { int t; cin>>t; for(int i=1;i<=t;i++) { int n; cin>>n; for(int j=0;j<n;j++) { cin>>tablica[j]; ile_zer[j]=0; } int y=-1; int x=0; while(x<n) { if(tablica[x]=='0') { y++; while(tablica[x]=='0' && x<n) { ile_zer[y]+=1; x++; } } x++; } for(int j=0;j<n;j++) strony_zarazania[j]=2; if(tablica[0]!='1') strony_zarazania[0]=1; if(tablica[n-1]!='1') strony_zarazania[y]=1; int z=y; int suma_zarazaczy; for(int i=0;i<=y;i++) suma_zarazaczy+=strony_zarazania[i]; while(suma_zarazaczy!=0) { z=y; quicksort(ile_zer,0,y,strony_zarazania); while(strony_zarazania[z]==0 && z>=0) z--; strony_zarazania[z]-=1; rozprzestrzenianie(strony_zarazania,ile_zer,y); suma_zarazaczy=0; for(int i=0;i<=y;i++) suma_zarazaczy+=strony_zarazania[i]; } int suma=0; for(int i=0;i<=y;i++) suma+=ile_zer[i]; cout<<n-suma<<"\n"; } return 0; } |
English