首页 > 其他 > 详细

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

时间:2016-04-10 01:06:34      阅读:302      评论: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
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!