Codeforces 660C Hard Process(尺取法)
题目大概说给一个由01组成的序列,要求最多把k个0改成1使得连续的1的个数最多,输出一种方案。
和CF 676C相似。
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 int a[333333]; 5 int main(){ 6 int n,k; 7 scanf("%d%d",&n,&k); 8 for(int i=0; i<n; ++i){ 9 scanf("%d",a+i); 10 } 11 if(k==0){ 12 int ans=0,cnt=0;; 13 for(int i=0; i<n; ++i){ 14 if(a[i]==0){ 15 cnt=0; 16 continue; 17 } 18 ++cnt; 19 ans=max(ans,cnt); 20 } 21 printf("%d\n",ans); 22 for(int i=0; i<n; ++i){ 23 printf("%d ",a[i]); 24 } 25 return 0; 26 } 27 int i=0,j=0,tmpn=0,tmpk=0,ans=0,rec; 28 while(j<n){ 29 if(a[j]==0){ 30 while(tmpk==k){ 31 if(a[i]==0) --tmpk; 32 --tmpn; 33 ++i; 34 } 35 ++tmpk; 36 } 37 ++tmpn; 38 if(tmpn>ans){ 39 ans=tmpn; 40 rec=j; 41 } 42 ++j; 43 } 44 printf("%d\n",ans); 45 for(int i=0; i<=rec-ans; ++i){ 46 printf("%d ",a[i]); 47 } 48 for(int i=rec-ans+1; i<=rec; ++i){ 49 printf("1 "); 50 } 51 for(int i=rec+1; i<n; ++i){ 52 printf("%d ",a[i]); 53 } 54 return 0; 55 }