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内核
2008年04月27日 整理了一下Linux内核编译的方法,原始内核版本为Linux-2.4.20.8,新内核版本为Linux-2.4.22,其它内核版本编译方法类似. 一 准备工 ...
- 谈谈MySQL死锁之二 死锁检测和处理源码分析
这一篇主要是通过一个实验来进行描述,过程是比较枯燥的. 实验准备 create table test_lock(id int auto_increment primary key ,stock int ...
- 12C配置EM Express的https端口
1.启动监听并查看监听信息 $ lsnrctl stat ora12 LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 07-FEB-2017 ...
- 用.NET CORE做项目,VS里编译碰到‘。。。。包降级。。。。’错误
用.NET CORE做项目,VS里编译碰到‘....包降级....’错误 本地开发机:WIN10+VS2017 15.7.3 ,用CORE2.1版本的建立一个项目,做好了,传到gitee上 今天有新同 ...
- 自动化CodeReview - ASP.NET Core依赖注入
自动化CodeReview系列目录 自动化CodeReview - ASP.NET Core依赖注入 自动化CodeReview - ASP.NET Core请求参数验证 我个人比较懒,能自动做的事绝 ...
- php中static和self的区别
在阅读一些框架的源码时发现了new static(),和new self(),甚是不解,后来查阅资料,才知道static采用了延迟绑定,能准确知道是父类还是子类的调用.这就是说static是个聪明的小 ...
- PE病毒初探——向exe注入代码
PE文件其实就是Windows可执行文件,关于它的一些简要介绍摘自百度: PE文件被称为可移植的执行体是Portable Execute的全称,常见的EXE.DLL.OCX.SYS.COM都是PE文件 ...
- 纯CSS3冒泡动画按钮实现教程
这款CSS3动画按钮非常的有创意,鼠标在滑过按钮时并不像其他按钮那样仅仅改变按钮的背景颜色,而是出现很酷的冒泡动画.这么惊艳的CSS3动画按钮,这篇文章主要将按钮实现的过程和代码分享给大家,希望能给在 ...
- Scala学习笔记——简化代码、柯里化、继承、特质
1.简化代码 package com.scala.first import java.io.File import javax.management.Query /** * Created by co ...
- 手动添加jar包到本地maven仓库(已测)ok
很多时候我们需要的jar包在maven仓库上没有 我们可以自己找到这个jar包,但是怎么通过在pom文件配置使用呢? 需要我们手动将本地的jar包添加到本地maven仓库. 前提是已经配置好maven ...