码迷,mamicode.com
首页 > 其他好文 > 详细

[2016-04-09][codeforces][660][C][Hard Process]

时间:2016-04-10 01:07:53      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:

  • 时间:2016-04-09 23:59:40 星期六

  • 题目编号:[2016-04-09][codeforces][660][C][Hard Process]

  • 题目大意:给定一个0 1序列,在最多把k个0改成1的情况下,最长的1子串有多长,

  • 分析:

    • 二分答案
      • check():枚举长度为mid的子串,判断里面的0的数目是否小于等于1,
  1. #include<cstdio>
  2. using namespace std;
  3. const int maxn = 3*1E5 + 10;
  4. int a[maxn],b[maxn],n,k;
  5. int check(int x){
  6. for(int i = x ; i <= n ; ++i){
  7. if(b[i] - b[i - x] + k >= x) return 1;
  8. }
  9. return 0;
  10. }
  11. void print(int x){
  12. int flg = 0;
  13. for(int i = x ; i <= n ; ++i){
  14. if(b[i] - b[i - x] + k >= x){
  15. for(int j = i - x + 1;j <= i ; ++j){
  16. a[j] = 1;flg = 1;
  17. }
  18. }
  19. if(flg) break;
  20. }
  21. for(int i = 1;i <= n ; ++i) printf("%d ",a[i]);
  22. }
  23. int main(){
  24. scanf("%d%d",&n,&k);
  25. for(int i = 1 ; i <= n ; ++i){
  26. scanf("%d",a+i);
  27. b[i] = b[i - 1] + a[i];
  28. }
  29. int l = 0,r = n + 1,mid,res;
  30. while(r >= l){
  31. mid = (l + r)>>1;
  32. if(check(mid)){
  33. l = mid + 1;
  34. res = mid;
  35. }
  36. else r = mid - 1;
  37. }
  38. printf("%d\n",res);
  39. print(res);
  40. return 0;
  41. }




[2016-04-09][codeforces][660][C][Hard Process]

标签:

原文地址:http://www.cnblogs.com/qhy285571052/p/b59193307440e81cdda1b49e7d7a3fb2.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!