Codeforces 660C - Hard Process - [二分+DP]
题目链接: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代码:
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
#define mp(x,y) make_pair(x,y)
#define fi first
#define se second
const int maxn=3e5+;
int n,k;
int a[maxn];
int f[maxn];
P check(int x)
{
int mx=, p=x;
for(int i=;i<=x;i++) f[i]=f[i-]+a[i], mx=max(mx,f[i]); for(int i=x+;i<=n;i++)
{
f[i]=f[i-]-a[i-x]+a[i];
if(f[i]>mx) mx=f[i], p=i;
}
return mp(mx+k>=x,p);
}
int main()
{
cin>>n>>k;
for(int i=;i<=n;i++) scanf("%d",&a[i]); int l=k, r=n, ans, pos;
while(l<=r)
{
if(r-l<=)
{
for(int mid=r;mid>=l;mid--)
{
P res=check(mid);
if(!res.fi) continue;
ans=mid, pos=res.se;
break;
}
break;
}
int mid=(l+r)/;
if(check(mid).fi) l=mid;
else r=mid;
} cout<<ans<<endl;
for(int i=;i<=pos-ans;i++) printf("%d ",a[i]);
for(int i=pos-ans+;i<=pos;i++) printf("1 ");
for(int i=pos+;i<=n;i++) printf("%d ",a[i]);
}
Codeforces 660C - Hard Process - [二分+DP]的更多相关文章
- hdu 3433 A Task Process 二分+dp
A Task Process Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- Codeforces 660C Hard Process【二分 Or 尺取】
题目链接: http://codeforces.com/problemset/problem/660/C 题意: 给定0.1组成的数组,可以改变k个0使其为1,问最终可以得到的连续的1的最大长度. 分 ...
- Codeforces 994F Compute Power 二分+DP
题意:给n个任务 每个任务有两个值$a,b$ 现有许多机器 每台最多可以执行两次任务 若存在第二次任务则满足$a_{second}<a_{first}$ 定义代价$val = \frac { \ ...
- hdu3433A Task Process( 二分dp)
链接 二分时间,在时间内dp[i][j]表示截止到第i个人已经做了j个A最多还能做多少个B #include <iostream> #include<cstdio> #incl ...
- Codeforces 660C Hard Process(尺取法)
题目大概说给一个由01组成的序列,要求最多把k个0改成1使得连续的1的个数最多,输出一种方案. 和CF 676C相似. #include<cstdio> #include<algor ...
- codeforces 660C Hard Process
维护一个左右区间指针就可以. #include<cstdio> #include<cstring> #include<iostream> #include<q ...
- 二分+DP HDU 3433 A Task Process
HDU 3433 A Task Process Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- codeforces 808 E. Selling Souvenirs (dp+二分+思维)
题目链接:http://codeforces.com/contest/808/problem/E 题意:最多有100000个物品最大能放下300000的背包,每个物品都有权值和重量,为能够带的最大权值 ...
- Hard Process(二分)
Hard Process Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submi ...
随机推荐
- 【Linux】linux/unix下telnet提示Escape character is '^]'的意义
在linux/unix下使用telnet hostname port连接上主机后会提示Escape character is '^]' 这个提示的意思是按Ctrl + ] 会呼出telnet的命令行, ...
- DNS-320 B2 语言包
神一样的NAS啊,这个语言包在这里http://tsd.dlink.com.tw/downloads2008detailgo.asp,选择sc的就可以了. 真是神一样的配置~ 佩服死d-link了
- C++11 右值引用和转移语义
新特性的目的 右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Sementics) 和 ...
- 【转】Ubuntu FireFox无法播放网页视频音乐的解决办法
原文:http://www.codeweblog.com/%E8%A7%A3%E5%86%B3qq%E9%9F%B3%E4%B9%90%E7%BD%91%E9%A1%B5%E7%89%88%E5%9C ...
- C#获取文件版本信息
使用FileVersionInfo获取版本信息 FileVersionInfo info = FileVersionInfo.GetVersionInfo(Application.Current.St ...
- 解决highCharts导出功能汉化问题
本文以highCharts中文网上的例子为原型,处理解决highCharts导出功能为英文的问题. 我们使用highCharts当然希望所有提示或文本都是中文的了,但是highCharts的默认语言是 ...
- 深入探讨WPF的ListView控件
接上一篇博客初步探讨WPF的ListView控件(涉及模板.查找子控件) 我们继续探讨ListView的用法 一.实现排序功能 需求是这样的:假如我们把学生的分数放入ListView,当我 ...
- MySQL临时表创建及旧表建新表
1.创建临时表 临时表是一张表,用来临时保存一些数据 特点: 只对创建该临时表的用户可见: 当会话结束时,MySQL自动删除临时表. 临时表的核心:建表和删表消耗资源极其少 创建临时表的基本格式: C ...
- 除了/etc/init.d/加启动脚本 或者在/etc/rc.local中加启动命令,还可以通过crontab来完成服务器重启后自动启动服务的操作
@reboot /bin/sh /opt/soft/percona/bin/mysqld_safe --defaults-file=/mnt/perconadata/my.cnf --basedir= ...
- 【zheng环境准备】安装activemq
1.下载http://activemq.apache.org/activemq-5140-release.html 2.移动到linux机器上 3.解压 tar -zxvf apache-active ...