题目链接:http://codeforces.com/problemset/problem/660/C

题意:

给你一个长度为 $n$ 的 $01$ 串 $a$,记 $f(a)$ 表示其中最长的一段连续 $1$ 的长度。

现在你最多可以将串中的 $k$ 个 $0$ 变成 $1$,求操作后的 $f(a)$。

题解:

(说实话这道题不看tag我不一定能想得出来……)

首先考虑二分枚举答案,对于一个假定的 $f(a)=x$,我们需要判断能不能满足:

用 $dp[i]$ 表示 $a[i-x+1], \cdots, a[i]$ 的这一段上 $1$ 的数目,那么只要存在一个 $dp[i] + k \ge x$ 就代表这个答案 $f(a)=x$ 是可行的。

另外,考虑到二分的边界问题比较难处理,故在区间被缩得比较小的时候可以改用暴力枚举。

同时,考虑到还有输出的问题,可以在让二分的check(mid)函数不是单纯返回 $0,1$,还可以再返回一个数代表答案子串的位置。

AC代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef pair<int,int> P;
  4. #define mp(x,y) make_pair(x,y)
  5. #define fi first
  6. #define se second
  7. const int maxn=3e5+;
  8. int n,k;
  9. int a[maxn];
  10. int f[maxn];
  11. P check(int x)
  12. {
  13. int mx=, p=x;
  14. for(int i=;i<=x;i++) f[i]=f[i-]+a[i], mx=max(mx,f[i]);
  15.  
  16. for(int i=x+;i<=n;i++)
  17. {
  18. f[i]=f[i-]-a[i-x]+a[i];
  19. if(f[i]>mx) mx=f[i], p=i;
  20. }
  21. return mp(mx+k>=x,p);
  22. }
  23. int main()
  24. {
  25. cin>>n>>k;
  26. for(int i=;i<=n;i++) scanf("%d",&a[i]);
  27.  
  28. int l=k, r=n, ans, pos;
  29. while(l<=r)
  30. {
  31. if(r-l<=)
  32. {
  33. for(int mid=r;mid>=l;mid--)
  34. {
  35. P res=check(mid);
  36. if(!res.fi) continue;
  37. ans=mid, pos=res.se;
  38. break;
  39. }
  40. break;
  41. }
  42. int mid=(l+r)/;
  43. if(check(mid).fi) l=mid;
  44. else r=mid;
  45. }
  46.  
  47. cout<<ans<<endl;
  48. for(int i=;i<=pos-ans;i++) printf("%d ",a[i]);
  49. for(int i=pos-ans+;i<=pos;i++) printf("1 ");
  50. for(int i=pos+;i<=n;i++) printf("%d ",a[i]);
  51. }

Codeforces 660C - Hard Process - [二分+DP]的更多相关文章

  1. hdu 3433 A Task Process 二分+dp

    A Task Process Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  2. Codeforces 660C Hard Process【二分 Or 尺取】

    题目链接: http://codeforces.com/problemset/problem/660/C 题意: 给定0.1组成的数组,可以改变k个0使其为1,问最终可以得到的连续的1的最大长度. 分 ...

  3. Codeforces 994F Compute Power 二分+DP

    题意:给n个任务 每个任务有两个值$a,b$ 现有许多机器 每台最多可以执行两次任务 若存在第二次任务则满足$a_{second}<a_{first}$ 定义代价$val = \frac { \ ...

  4. hdu3433A Task Process( 二分dp)

    链接 二分时间,在时间内dp[i][j]表示截止到第i个人已经做了j个A最多还能做多少个B #include <iostream> #include<cstdio> #incl ...

  5. Codeforces 660C Hard Process(尺取法)

    题目大概说给一个由01组成的序列,要求最多把k个0改成1使得连续的1的个数最多,输出一种方案. 和CF 676C相似. #include<cstdio> #include<algor ...

  6. codeforces 660C Hard Process

    维护一个左右区间指针就可以. #include<cstdio> #include<cstring> #include<iostream> #include<q ...

  7. 二分+DP HDU 3433 A Task Process

    HDU 3433 A Task Process Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  8. codeforces 808 E. Selling Souvenirs (dp+二分+思维)

    题目链接:http://codeforces.com/contest/808/problem/E 题意:最多有100000个物品最大能放下300000的背包,每个物品都有权值和重量,为能够带的最大权值 ...

  9. Hard Process(二分)

    Hard Process Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submi ...

随机推荐

  1. 基于Centos搭建个人 Leanote 云笔记本

    系统要求:CentOS 7.2 64 位操作系统 下载启动 MongoDB Leanote 依赖 MongoDB 作为数据存储,下面开始安装 MongoDB: 下载 MongoDB 进入 /home  ...

  2. 基于Ubuntu部署 memcached 服务

    系统要求:Ubuntu 16.04.1 LTS 64 位操作系统 安装并启动 memcached 服务 安装 memcached 使用apt-get安装 memcached sudo apt-get ...

  3. CDN介绍

    作者:视界云链接:https://www.zhihu.com/question/37353035/answer/175217812来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  4. 实例展示elasticsearch集群生态,分片以及水平扩展.

    elasticsearch用于构建高可用和可扩展的系统.扩展的方式可以是购买更好的服务器(纵向扩展)或者购买更多的服务器(横向扩展),Elasticsearch能从更强大的硬件中获得更好的性能,但是纵 ...

  5. block 对外部引用变量的处理

    MRC 环境 一.静态变量 和 全局变量   在加和不加  __block 都会直接引用变量地址.也就意味着 可以修改变量的值.在没有加__block 参数的情况下. 全局block 和 栈block ...

  6. 《转》推荐几个精致的web UI框架

    1.Aliceui Aliceui是支付宝的样式解决方案,是一套精选的基于 spm 生态圈的样式模块集合,是 Arale 的子集,也是一套模块化的样式命名和组织规范,是写 CSS 的更好方式. git ...

  7. 《CLR via C#》读书笔记 之 线程基础

    第二十五章 线程基础 2014-06-28 25.1 Windows为什么要支持线程 25.2 线程开销 25.3 停止疯狂 25.6 CLR线程和Windows线程 25.7 使用专用线程执行异步的 ...

  8. Android Studio 运行出现 Multiple dex files define Landroid/support/annotation/AnimRes 解决方法

    引入的工程的android-support-v4.jar版本跟自己工程的android-support-v4.jar的版本不一样

  9. Java知多少(42)泛型通配符和类型参数的范围

    本节先讲解如何限制类型参数的范围,再讲解通配符(?). 类型参数的范围 在泛型中,如果不对类型参数加以限制,它就可以接受任意的数据类型,只要它是被定义过的.但是,很多时候我们只需要一部分数据类型就够了 ...

  10. Java知多少(45)未被捕获的异常

    在你学习在程序中处理异常之前,看一看如果你不处理它们会有什么情况发生是很有好处的.下面的小程序包括一个故意导致被零除错误的表达式. class Exc0 { public static void ma ...