H - Checker FZU - 2041

题意:

一个长度为n的01串,现在能将里面的1移动m次,问最长的连续0是多长

题解:

没想出来,看了其他人代码,就是对于每个0空间进行扩充,然后记录每次扩充的最大值
关键在于扩充的细节:
我们每次锁定一个连续的0的左右端点(图中的left和right)
然后看left和right分别向外找最近的0,我们可以通过下图看出,左侧长度为lena可以找到0,右侧lenb可以找到0,lena<lenb,所以我们移动左侧
每次移动也是缓慢移动,我们让i和j进行交换,然后看left-1(即k的位置)是否为0,如果是0,left就向左移动,相当于扩大区间,
为什么要先交换i和j呢?因为要扩大范围,只能先换走j,再换走k,一步一步来,不能着急,每次移动都会消耗步数

这个思路很妙

代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;typedef long long LL;
const double eps = 1e-6;
const int INF = 0x3f3f3f3f;
const int MAXN = 500 + 10;
int t, len, step;
char G[MAXN], CG[MAXN];int Calc(int left, int right) {strcpy(CG, G);int cnt = step;int low = left - 1, high = right + 1;while (cnt--) {if (low - 1 < 0 && high + 1 >= len) break;for (;;) {if (low - 1 < 0 && high + 1 >= len) break;int lena = INF, lenb = INF;bool yes = false;if (low - 1 >= 0 && CG[low - 1] == '0') {//记录两个0之间相隔1的数量 lena = left - (low - 1);yes = true;} if (high + 1 < len && CG[high + 1] == '0') {lenb = high + 1 - right;yes = true;}if (!yes) {//如果low和high还没找到0,继续向外找 --low;++high;continue;}if (lena < lenb) {//相隔1最少的 swap(CG[low], CG[low - 1]);if (CG[left - 1] == '0') {//查看left是否可以向左扩展 --left;}} else {swap(CG[high], CG[high + 1]);if (CG[right + 1] == '0') {++right;}}low = left - 1;high = right + 1;break;}}return right - left + 1;
}int main() {scanf("%d", &t);int cas = 0;while (t--) {scanf("%d%d%s", &len, &step, G);int ans = 0;for (int i = 0; i < len;) {if (G[i] == '0') {int j = i;while (j + 1 < len && G[j + 1] == '0') { ++j; }//每次找到连续0的左右端点 ans = max(ans, Calc(i, j));i = j + 1;} else {++i;}}printf("Case %d: %d\n", ++cas, ans);}return 0;
}

H - Checker FZU - 2041相关推荐

  1. 2011年全国大学生程序设计邀请赛(福州)

    题号 题目 考点 难度 A Password table 模拟 签到 B Axial symmetry 计算几何 代码题 C Log Calculator java大数 D Maximum Value ...

  2. H - 栀子花开 FZU - 1921

    H - 栀子花开 FZU - 1921 Time limit  1000 ms        Memory limit  32768 kB 这是一个栀子花开的季节,也是一个离别的季节,四年一千多个日日 ...

  3. FZU - 2301 H - Chosen by god (组合数学)

    原题地址:http://acm.fzu.edu.cn/problem.php?pid=2301 题意:有n次攻击回合,每个回合的攻击有一点伤害,但是可能攻击到敌方无限血的英雄,也可能攻击到敌方的一个血 ...

  4. API Sanity Checker在Ubuntu中的使用

    API Sanity Checker是一个自动生成单元测试用例的工具,可用于链接测试.它可用于三大桌面平台,下面简单介绍它在Linux下的使用步骤: 1.      从http://ispras.li ...

  5. USACO Section 1.5 Checker Challenge

    经典八皇后问题 只写的最基本的,对称剪枝,位运算都没有用,以后有时间再看 1 /* ID:linyvxi1 2 PROB:checker 3 LANG:C++ 4 */ 5 #include < ...

  6. FZU 1686 神龙的难题(DLX反复覆盖)

    FZU 1686 神龙的难题 题目链接 题意:中文题 思路:每个1看成列,每个位置作为左上角的矩阵看成行.dlx反复覆盖就可以 代码: #include <cstdio> #include ...

  7. 我用nagios-check_http check Checker

    这几天按照yahoon兄的大作完成了nagios的配置.并成功监控linux+win服务器的各种服务.     在这里把遇到的问题整理了下.   1.  mail : sendmail 一个小工具实现 ...

  8. FZU Monthly-201903 获奖名单

    FZU Monthly-201903 获奖名单 冠军: 黄海东 S031702647 一等奖: 林闽沪 S131700309 陈华能 S221701416 二等奖: 鲍子涵 S031702646 吴少 ...

  9. Discrete Logging hunnu10590 pku2417 fzu 1352 hit 1928 zoj 1898

    以下转自:http://hi.baidu.com/aekdycoin/blog/item/b317ca18bb24334942a9ad55.html [普通Baby Step Giant Step] ...

最新文章

  1. 李安的电影梦by李安
  2. A股开盘:深证区块链50指数跌0.32%,118只概念股下跌
  3. 广告流量分析之评价指标的选择(一)
  4. 关于小范围整数N拆解成2的幂相加的个数
  5. 锐捷破号破解流程笔记
  6. linux dhcpv6有状态配置,翻译:IPv6地址自动配置:有状态和无状态的区别
  7. 两种常见的台式计算机,win7电脑定时关机的两种最常用方法【图文】
  8. 微软sccm服务器,微软SCCM是什么?
  9. 饿了么推荐系统:从0到1
  10. 攻防世界misc 如来十三掌
  11. 结构体所占字节数的计算
  12. 戴尔win10开机后,在桌面点右键一直转圈,但任务栏又能正常点击
  13. 趣店新项目万里目,百亿补贴计划,能烧出一个未来吗
  14. css下拉菜单出现下划线,简单带下划线跟随效果的CSS3下拉菜单特效
  15. C语言--自定义字符串输入/输出函数
  16. RIKIBOT-FX4多线激光雷达用谷歌cartographer构建3D地图
  17. 《三易通服装进销存软件》项目研发阶段性总结
  18. AutoJS实现淘金币任务,双十二任务
  19. 正点原子探索者(STM32F407),非正点HC05蓝牙点灯代码
  20. jq 获取url跳转页面带的参数

热门文章

  1. 万万想不到:吸烟的辐射量比原子弹爆炸点还厉害!
  2. 一个女程序员征男友的需求说明书
  3. java外键实体类_java – 在Embeddable类中的外键映射
  4. Android 封装handler,android封装工作线程跟Handler工具类
  5. html 输入框自动缩短 一行内显示,JQuery UI组合框自动补全功能改进版(即时全部显示+input内容保存)...
  6. 机器学习之数据预处理——数据清洗(缺失值、异常值和重复值的处理)
  7. python函数体中可以不写返回值语句_python让函数不返回结果的方法
  8. C++ 详解拷贝构造函数
  9. [Java基础]字符流中的编码解码问题
  10. List(C++模版实现的带哨兵的双向链表)