FZU 2041 二分枚举
思路:先O(n)预处理出ri[i][j],le[i][j],分别表示第i个位置向右边移动出j个空格需要的步数,表示第i个位置向左边移动出j个空格需要的步数。
然后枚举间隙处,二分判段最大间隔。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define Maxn 710
#define inf 100000000
using namespace std;
int ri[Maxn][Maxn],le[Maxn][Maxn],n,m;
char str[Maxn];
bool OK(int pos,int x)
{
int i,j,cnt=inf;
if(pos==) {
cnt=min(cnt,ri[pos][x]);
return cnt<=m;
}
for(i=;i<=n;i++){
if(i>x) break;
cnt=min(cnt,ri[pos][i]+le[pos-][x-i]);
}
//cout<<pos<<" "<<x<<" "<<cnt<<" "<<m<<endl;
return cnt<=m;
}
int main()
{
int t,i,j,ze,Ca=;
scanf("%d",&t);
while(t--){
for(i=;i<Maxn;i++){
for(j=;j<Maxn;j++){
ri[i][j]=le[i][j]=inf;
}
}
ze=;
scanf("%d%d%s",&n,&m,str);
if(str[]=='') le[][]=,ze=;
for(i=;i<n;i++){
if(str[i]=='') ze++;
for(j=;j<=n;j++){
if(le[i][j-]>=inf) break;
if(str[i]=='')
le[i+][j]=le[i][j]+j;
else
le[i+][j]=le[i][j-];
}
}
if(str[n-]=='') ri[n][]=ri[n+][]=;
for(i=n-;i>=;i--){
for(j=;j<=n;j++){
if(ri[i+][j-]>=inf) break;
if(str[i-]=='')
ri[i][j]=ri[i+][j]+j;
else
ri[i][j]=ri[i+][j-];
}
}
int f=;
int ans=,l,r,mid;
for(i=;i<=n;i++){
if(str[i-]==''){
l=;r=ze;
while(l+<r){
mid=(l+r)>>;
if(OK(i,mid))
l=mid;
else
r=mid;
}
ans=max(ans,l);
if(OK(i,r))
ans=max(ans,r);
}
}
printf("Case %d: %d\n",++Ca,ans);
}
return ;
}
FZU 2041 二分枚举的更多相关文章
- FZU-2216 The Longest Straight (二分枚举)
题目大意:给n个0~m之间的数,如果是0,那么0可以变为任意的一个1~m之间的一个数.从中选出若干个数,使构成一个连续的序列.问能构成的最长序列的长度为多少? 题目分析:枚举连续序列的起点,二分枚举二 ...
- uva 12587 二分枚举
思路:维护一个森林,二分枚举最小的最大值. #include<set> #include<map> #include<cmath> #include<queu ...
- SDIBT 3237 Boring Counting( 划分树+二分枚举 )
http://acm.sdibt.edu.cn/JudgeOnline/problem.php?id=3237 Problem H:Boring Counting Time Limit: 3 Sec ...
- POJ 3273 Monthly Expense 二分枚举
题目:http://poj.org/problem?id=3273 二分枚举,据说是经典题,看了题解才做的,暂时还没有完全理解.. #include <stdio.h> #include ...
- POJ 2112 Optimal Milking(Floyd+多重匹配+二分枚举)
题意:有K台挤奶机,C头奶牛,每个挤奶机每天只能为M头奶牛服务,下面给的K+C的矩阵,是形容相互之间的距离,求出来走最远的那头奶牛要走多远 输入数据: 第一行三个数 K, C, M 接下来是 ...
- hdu 5248 序列变换(二分枚举)
Problem Description 给定序列A={A1,A2,...,An}, 要求改变序列A中的某些元素,形成一个严格单调的序列B(严格单调的定义为:Bi<Bi+,≤i<N). 我们 ...
- HDU 1669 Jamie's Contact Groups(多重匹配+二分枚举)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1669 题目大意: 给你各个人可以属于的组,把这些人分组,使这些组中人数最多的组人数最少,并输出这个人数 ...
- Codeforces 807C - Success Rate(二分枚举)
题目链接:http://codeforces.com/problemset/problem/807/C 题目大意:给你T组数据,每组有x,y,p,q四个数,x/y是你当前提交正确率,让你求出最少需要再 ...
- Codeforces 801C Voltage Keepsake(二分枚举+浮点(模板))
题目链接:http://codeforces.com/contest/801/problem/C 题目大意:给你一些电器以及他们的功率,还有一个功率一定的充电器可以给这些电器中的任意一个充电,并且不计 ...
随机推荐
- Jmeter模拟http请求
一.获取用户信息(GET请求):http://hostname/getuser?userid=1 1.打开jmeter,创建一个线程组,再添加一个http请求Sampler 2.设置域名.路径.请求方 ...
- 踩坑日志!viser-ng的使用
在ng-alian项目中使用viser图表库,在app.module中引用了viser-ng,然而,在具体的html项目中使用<v-chart>会报错,提示v-chart不是一个angul ...
- 51nod——2487小b和环
dp[ i ][ 0 ] : 第i个位置不取 dp[ i ][ 1 ] : 第i个位置取 这样就可以得到状态转移方程: dp[i][0]=max(max(dp[i][0],dp[i-1][1]),dp ...
- 配置vim nginx.conf高亮
#!/bin/bashwget http://www.vim.org/scripts/download_script.php?src_id=14376 -O nginx.vimmv nginx.vim ...
- js数组删除(splice和delete)
最近一直在写js的数组,然后就发现了很奇怪的问题,后来才发现了规律. 删除数据的一行,一般有两种方法,一个是splice,一个是delete: splice:删除了数组后,数组的长度会自动变化.用法: ...
- JZOJ 3508. 【NOIP2013模拟11.5B组】好元素
3508. [NOIP2013模拟11.5B组]好元素(good) (File IO): input:good.in output:good.out Time Limits: 2000 ms Mem ...
- Linux 面试的一些基础命令
1.查询服务器负载 (1)uptime [root@oldboy ~]# uptime 20:17:18 up 7:41, 2 users, load average: 0.00, 0.00, 0.0 ...
- linux下安装VMware出错:Gtk-Message: Failed to load module "canberra-gtk-module"解决方法
最近又有兴趣在linux下搭建个虚拟机,于是去找了个VMWorkstation,安装的过程中报了两个错误 Gtk-Message: Failed to load module "pk-gtk ...
- 通过uboot传参设置mtd分区流程源码分析
因为公司同事反映他使用的开板无法将根目录下的ip_work目mounth成功,由于本人当时没有去现场查看问题,只是象征性的询问内核是否创建了/dev/mtdblock5设备节点,因为该开发板默认是挂载 ...
- Birthday Paradox
Birthday Paradox Sometimes some mathematical results are hard to believe. One of the common problems ...