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中搭建一个ftp服务器详解
来源:Linux社区 作者:luzhi1024 详解Linux中搭建一个ftp服务器. ftp工作是会启动两个通道:控制通道 , 数据通道在ftp协议中,控制连接均是由客户端发起的,而数据连接有两种 ...
- leetcode笔记:3Sum Closest
一.题目描写叙述 二.解题技巧 该题与3Sum的要求类似.不同的是要求选出的组合的和与目标值target最接近而不一定相等.但实际上,与3Sum的算法流程思路类似,先是进行排序.然后顺序选择数组A中的 ...
- kafka项目中踩到的一个坑(客户端和服务器端版本不一致问题)
启动项目时控制台抛出的异常信息: -- :: --- [ main] o.s.s.c.ThreadPoolTaskScheduler : Initializing ExecutorService 't ...
- vue cli 项目的提交
前提: 配置git.以及git的ssh key信息 假设已经都安装好了,此处我用vue项目为例,因为vue-cli已经默认为我生成了ignore文件 在项目目录 初始化本地仓库,会创建一个.git目录 ...
- netbeans增加yii的代码提示
在NetBeans中创建PHP项目 NetBeans目前还没有直接支持Yii Framework或Yii相关的插件,但是可以通过其他方式来实现Yii的代码自动提示. 首先,打开新建项目向导,创建一个“ ...
- 【iCore4 双核心板_ARM】例程四:USART实验——通过命令控制LED
实验原理: 开发板上自带一片CH340芯片,完成本实验电脑需要安装CH340驱动, CH340的TXD连接STM32的GPIO(PXC7),CH340的RXD连接STM32的 GPIO(PC6),通过 ...
- win7(64bit)+python3.5+pyinstaller3.2安装和测试
最近因为做项目需要,需要在win7中安装pyinstaller用于将.py文件生成脱离python平台的可执行程序*.exe文件. 安装步骤 第一步:安装python3.5 [下载python3.5的 ...
- 点云PCL中小细节
计算点与点之间的距离的平局距离 double computeCloudResolution (const pcl::PointCloud<PointType>::ConstPtr & ...
- Wifi 开放系统认证和共享密钥身份认证
记录开放系统认证和共享密钥认证的区别. 开放系统身份认证(open-systern authentication) 是802.11 要求必备的惟一方式. 由行动式工作站所发出的第一个帧被归类为auth ...
- 使用InstallAnywhere7.1制作Java exe程序安装包
[转[使用InstallAnywhere7.1制作Java exe程序安装包 使用InstallAnywhere7.1制作Java exe程序安装包 对于已经完成的Java应用程序开发项目,从商业化角 ...