一种新型疾病,COWVID-19,开始在全世界的奶牛之间传播。

Farmer John 正在采取尽可能多的预防措施来防止他的牛群被感染。

Farmer John 的牛棚是一个狭长的建筑物,有一排共 N 个牛栏。

有些牛栏里目前有奶牛,有些目前空着。

得知“社交距离”的重要性,Farmer John 希望使得 D 尽可能大,其中 D 为最近的两个有奶牛的牛栏的距离。

例如,如果牛栏 3 和 8是最近的有奶牛的牛栏,那么D=5。

最近两头奶牛新来到 Farmer John 的牛群,他需要决定将她们分配到哪两个之前空着的牛栏。

请求出他如何放置这两头新来的奶牛,使得 D 仍然尽可能大。

Farmer John 不能移动任何已有的奶牛;他只想要给新来的奶牛分配牛栏。

输入格式

输入的第一行包含 N。

下一行包含一个长为 N 的字符串,由0 和 1 组成,描述牛棚里的牛栏。

0 表示空着的牛栏,1 表示有奶牛的牛栏。

字符串中包含至少两个 0,所以有足够的空间安置两头新来的奶牛。

输出格式

输出 Farmer John 以最优方案在加入两头新来的奶牛后可以达到的最大 D 值(最近的有奶牛的牛栏之间的距离)。

2≤N≤10^5

分析题干:我们先浅浅地分析一下题干,这道题地意思就是我们往标号是0的围栏中放入两头奶牛,然后我要让两头奶牛之间的坐标差D越大越好;

一开始我是用了一个比较笨的思路,我考虑两头奶牛是不是要相邻的放,但这样的话考虑到出事的奶牛会有很多种情况,可能在头部,可能在中间有一个,可能一个都没有就需要分太多类了;

所以后买你在看题解的时候遇到的这个方法很好,我们可以先通过初始化牛栏数组来得到当前的D,已知加入两头奶牛之后,D不会变大,所以我们可以二分的搜索答案,我们令l = 1 , r = D,然后取mid,我们看当当前最大的D取到mid时可不可以插入两头牛;

所以我就写了一个check函数,我们把每一个已经放了牛的位置放在一个数组里面,我们从第一个数开始看,如果p(当前的位置)满足,p + mid + mid <= a[i],也就是说我在p后面mid的地方观察能不能放一头牛,也就是会不会和后面一个位置的牛的距离小于mid,如果行就插入并将p往后移动mid位置,重复操作直到不能插入,然后我就将p移动到a[i]上,以此类推;

值得注意的是,跳出循环后,p可能在最后一个已经有牛的位置上,他后面全是0,我也要向上面一样去做判断,最后观察我在保证D = mid的情况下能不能插入两头牛以上,能得话我就让ans = mid,然后继续二分直到边界跳出!

这样二分答案是非常常见的!

代码:

#include<bits/stdc++.h>
#define maxn 100010

using namespace std;
int n,m,ans = 0;
char str[maxn];
int a[maxn];

bool check(int x){
int p = 1-x , cnt = 0;
for(int i = 1;i<=m;i++){
while(p+x+x<=a[i]) p+=x, cnt++;
p = a[i];
}
while(p+x<=n) p+=x, cnt++;
return cnt>=2;
}

int main()
{
cin >> n;
cin >> str+1;
for(int i = 1;i<=n;i++)
if(str[i] == '1' ) a[++m] = i;
int l = 1 ,r = n;
for(int i=1; i<m; i++) r=min(r,a[i+1]-a[i]);
while(l<=r)
{
int mid = l+r >> 1;
if(check(mid)){
ans = mid;
l = mid+1;
}
else r = mid-1;
}
cout << ans;
return 0;
}

Acwing 社交距离 分类讨论+贪心的更多相关文章

  1. AtCoder Beginner Contest 173 E Multiplication 4 分类讨论 贪心

    LINK:Multiplication 4 害怕别人不知道我有多菜 那就上张图: 赛时 太慌了 (急着AK 题目不难却暴露我的本性 根本不思考无脑写 wa了还一直停不下来的debug 至少被我发现了1 ...

  2. ACM学习历程—UVALive 7147 World Cup(分类讨论 && 贪心)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

  3. CF1042C Array Product 分类讨论+贪心

    考虑有无负数(负数的个数为奇视作“有”,否则为“无”)和有无零 无负数无零,全部合并即可 无负数有零,那么把零合并起来,删掉零 有负数无零,把最大的负数找出来,删掉,合并剩余的数 有负数有零,把零和最 ...

  4. Bzoj4558:分类讨论 计算几何 组合数学

    国际惯例的题面: 这题让我爆肝啦......这种计数显然容斥,正好不含任何坏点的我们不会算,但是我们能算至少含零个坏点的,至少含一个坏点的,至少含两个坏点的......所以最终的答案就是(至少含零个坏 ...

  5. HDU5957 Query on a graph(拓扑找环,BFS序,线段树更新,分类讨论)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5957 题意:D(u,v)是节点u和节点v之间的距离,S(u,v)是一系列满足D(u,x)<=k的点 ...

  6. NOJ——1665夜神的思考(YY+组合问题+分类讨论)

    [1665] 夜神的思考 时间限制: 1000 ms 内存限制: 65535 K 问题描述 最近夜神对二进制很感兴趣,于是他每次看到一串只包含1和0的字符串的时候就会想,这串字符串有多少子串是含有k个 ...

  7. CF629E Famil Door and Roads【树上计数+分类讨论】

    Online Judge:Codeforces629E,Luogu-CF629E Label:树上计数,分类讨论,换根 题目描述 给出一棵n个节点的树.有m个询问,每一个询问包含两个数a.b,我们可以 ...

  8. Codeforces 460D Little Victor and Set --分类讨论+构造

    题意:从区间[L,R]中选取不多于k个数,使这些数异或和尽量小,输出最小异或和以及选取的那些数. 解法:分类讨论. 设选取k个数. 1. k=4的时候如果区间长度>=4且L是偶数,那么可以构造四 ...

  9. BZOJ-1067 降雨量 线段树+分类讨论

    这道B题,刚的不行,各种碎点及其容易忽略,受不鸟了直接 1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2859 ...

随机推荐

  1. 02网络编程( socket套接字+TCP粘包 )

    目录 02 网络编程 一.socket套接字编程 二.简易代码模板 2.1 服务端 2.2 客户端 三.通信循环及代码优化 四.黏包现象 五.struct模块 六.简易版本报头 七.上传文件数据 * ...

  2. Go-grpc 实现

    什么是grpc和protobuf grpc ​ grpc是一个Google开源的高性能.开源和通用的RPC框架,面向移动和HTTP/2设计.目前提供C.Java和Go语言版本, 分别是grpc, gr ...

  3. Java中类变量(静态变量)和类方法(静态方法)

    类变量 类变量也叫静态变量或静态属性,是该类所有对象共享的变量任何一个该类的对象去访问它时,取得都是一样的值 语法: 访问修饰符  static  数据类型  变量名 static  访问修饰符  数 ...

  4. Spring是什么? 核心总结

    Spring是一个开源框架,它由Rod Johnson创建.它是为了解决企业应用开发的复杂性而创建的. Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情.  然而,Spring ...

  5. prometheus监控java项目(jvm等):k8s外、k8s内

    前言 虽然可以使用jvisualvm之类的工具监控java项目,但是集群环境下,还是捉襟见肘,下面介绍如何用主流的prometheus来监控java项目. java项目配置 在pom.xml中添加依赖 ...

  6. RainbowCrack彩虹表破解密码hash

    实验目的 使用彩虹表破解散列值b0baee9d279d34fa1dfd71aadb908c3f 实验原理 1)彩虹表破解是利用彩虹表破解散列数据的工具. 这种方法不同于暴力破解攻击.暴力破解攻击会将密 ...

  7. 十一讲/十二讲 最近总是学不进去,这咋办啊 哭了我i我i我i

    0: 2,9,7      错错错 帽号回来是列表 1:好像一样?   错错错  不一样,list[0]是一个值,冒号回来是个列表 2:A.insert(0,A[-1]) del A[-1]      ...

  8. freeswitch的任务引擎实现分析

    概述 freeswitch核心框架中有一个定时任务系统,在开发过程中用来做一些延时操作和异步操作很方便. 我们在VOIP的呼叫流程中,经常会有一些对实时性要求没那么高的操作,或者会有阻塞流程的操作,我 ...

  9. 【C# TAP 异步编程】四、SynchronizationContext 同步上下文|ExecutionContext

    一.同步上下文(SynchronizationContext)概述 由来 多线程程序在.net框架出现之前就已经存在了.这些程序通常需要一个线程将一个工作单元传递给另一个线程.Windows程序以消息 ...

  10. Python:获取某一月的天数

    import calendarcalendar.monthlen(2021,6)30calendar.monthrange(2021,6)(1, 30) calendar.monthrange( ye ...