一种新型疾病,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. Solution -「JOISC 2021」「LOJ #3495」聚会 2

    \(\mathcal{Description}\)   Link.   给定一棵含 \(n\) 个结点的树.称点集 \(S\) 到结点 \(u\) 的会合距离为 \(\sum_{v\in S}\ope ...

  2. 常用模块(Day25-Day28)

    模块分为三种: 1.内置模块:python安装时自带的. 2.扩展模块:别人写的,需要安装之后可以直接使用,如django,tornado等. 3.自定义模块:自己写的模块. 序列化模块 序列指字符串 ...

  3. STL漫游之vector

    std::vector 源码分析 从源码视角观察 STL 设计,代码实现为 libstdc++(GCC 4.8.5). 由于只关注 vector 的实现,并且 vector 实现几乎全部在头文件中,可 ...

  4. Python:PIL(二)——相关概念

    学习自:PIL官方文档--Concepts 写在最前:PIL只处理栅格(Raster)数据 1.Bands 一幅图像由一个或多个波段的数据组成.PIL允许我们在单幅图像中存储多个波段,前提是它们有相同 ...

  5. Python:Scrapy(二) 实例分析与总结、写一个爬虫的一般步骤

    学习自:Scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250 - 知乎 Python Scrapy 爬虫框架实例(一) - Blue·Sky - 博客园 1.声明Item 爬虫爬取的目标是从非 ...

  6. Flutter ChartSpace:通过跨端 Canvas 实现图表库

    基于Flutter 的图形语法库,通过跨端 Canvas ,将基于 Javascript 的图形语法库 ChartSpace 扩展至 Flutter 端 作者:字节跳动终端技术--胡珀 背景 数据平台 ...

  7. 『德不孤』Pytest框架 — 10、setUp()和tearDown()函数

    目录 1.setUp()和tearDown()函数介绍 2.setUp()和tearDown()函数作用 3.setUp()和tearDown()函数说明 4.示例 (1)方法级 (2)类级 (3)函 ...

  8. Cloud Computing Chapter3 (云计算第三章)

    本篇文章是对课程大型软件系统设计与体系结构(双语)[又名:云计算]的课堂内容总结,适用于大连交通大学. Cloud Computing Chapter3 Understanding Cloud Com ...

  9. 【行业Tip】三电是什么

    电动汽车的"三电"是指:电池.电机.电控.

  10. laravel7 ORM和laravel模型操作

    1.什么是ORM 对象关系映射(Object Relation Maping),这个关系就是关系数据库.因此,顾名思义,ORM的核心是我们通过操作对应来操作关系数据库. ORM的优点:  ORM提供了 ...