思路:先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 二分枚举的更多相关文章

  1. FZU-2216 The Longest Straight (二分枚举)

    题目大意:给n个0~m之间的数,如果是0,那么0可以变为任意的一个1~m之间的一个数.从中选出若干个数,使构成一个连续的序列.问能构成的最长序列的长度为多少? 题目分析:枚举连续序列的起点,二分枚举二 ...

  2. uva 12587 二分枚举

    思路:维护一个森林,二分枚举最小的最大值. #include<set> #include<map> #include<cmath> #include<queu ...

  3. SDIBT 3237 Boring Counting( 划分树+二分枚举 )

    http://acm.sdibt.edu.cn/JudgeOnline/problem.php?id=3237 Problem H:Boring Counting Time Limit: 3 Sec  ...

  4. POJ 3273 Monthly Expense 二分枚举

    题目:http://poj.org/problem?id=3273 二分枚举,据说是经典题,看了题解才做的,暂时还没有完全理解.. #include <stdio.h> #include ...

  5. POJ 2112 Optimal Milking(Floyd+多重匹配+二分枚举)

    题意:有K台挤奶机,C头奶牛,每个挤奶机每天只能为M头奶牛服务,下面给的K+C的矩阵,是形容相互之间的距离,求出来走最远的那头奶牛要走多远   输入数据: 第一行三个数 K, C, M  接下来是   ...

  6. hdu 5248 序列变换(二分枚举)

    Problem Description 给定序列A={A1,A2,...,An}, 要求改变序列A中的某些元素,形成一个严格单调的序列B(严格单调的定义为:Bi<Bi+,≤i<N). 我们 ...

  7. HDU 1669 Jamie's Contact Groups(多重匹配+二分枚举)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1669 题目大意: 给你各个人可以属于的组,把这些人分组,使这些组中人数最多的组人数最少,并输出这个人数 ...

  8. Codeforces 807C - Success Rate(二分枚举)

    题目链接:http://codeforces.com/problemset/problem/807/C 题目大意:给你T组数据,每组有x,y,p,q四个数,x/y是你当前提交正确率,让你求出最少需要再 ...

  9. Codeforces 801C Voltage Keepsake(二分枚举+浮点(模板))

    题目链接:http://codeforces.com/contest/801/problem/C 题目大意:给你一些电器以及他们的功率,还有一个功率一定的充电器可以给这些电器中的任意一个充电,并且不计 ...

随机推荐

  1. 【luogu P1637 三元上升子序列】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1637 BIT + 离散化. 读题得数据规模需离散化.BIT开不到longint这么大的数组. 对于题目所求的 ...

  2. React后台管理系统-table-list组件

    table-list组件可用于商品列表,用户列表页面 需要传入一个tableHeads集合和tablebody import React from 'react';   // 通用的列表 class ...

  3. Oracle 配置文件目录

    Oracle 配置文件目录 ① 在oracle安装目录下,找D:\oracle\product\10.2.0\client_1\NETWORK\ADMIN中的tnsnames.ora文件,找到之后,配 ...

  4. java Html&JavaScript面试题:判断第二个日期比第一个日期大

    如何用脚本判断用户输入的的字符串是下面的时间格式2004-11-21 必须要保证用户的输入是此格式,并且是时间,比如说月份不大于12等等,另外我需要用户输入两个,并且后一个要比前一个晚,只允许用JAV ...

  5. C/C++ 程序基础 (一)基本语法

    域操作符: C++ 支持通过域操作符访问全局变量,C不支持(识别为重定义) ++i和i++的效率分析: 内置类型,无区别 自定义数据类型,++i可以返回引用,i++只能返回对象值(拷贝开销) 浮点数与 ...

  6. mysql 5.7安装步骤:

    .下载完成后解压: 3.在mysql要目录下创建 my.ini 文件,如上图,文件内容如下,basedir 和 datadir 修改为相应地址: [mysql] # 设置mysql客户端默认字符集 d ...

  7. ubuntu16.04更换镜像源

    1.备份原有 cp /etc/apt/sources.list /etc/apt/sources.list.old 2.打开阿里巴巴镜像源:  https://opsx.alibaba.com/mir ...

  8. 安装并配置多实例Mysql数据库

    1.安装Mysql需要的依赖包 yum -y install ncurses-devel libaio-devel cmake 2.创建Mysql用户账号 useradd -s /sbin/nolog ...

  9. LNMP源码安装脚本

    LNMP安装脚本,脚本环境   #LNMP环境搭建centos6.8 2.6.32-696.28.1.el6.x86_64  nginx:1.12.2   mysql:5.6.36  PHP:5.5. ...

  10. Linux 面试的一些基础命令

    1.查询服务器负载 (1)uptime [root@oldboy ~]# uptime 20:17:18 up 7:41, 2 users, load average: 0.00, 0.00, 0.0 ...