AcWing.1659 社交距离 I
题目链接
题目思路
最开始想暴力,没暴出来。之后看了大佬的二分题解豁然开朗
因为是找最近距离的最大值,所以先找到最小的距离作为右边界
l, r表示待放奶牛的位置与上一奶牛的位置差
check函数的p作为当前奶牛位置,初始化为1 - x是因为区间是[1, n],要保证在p+x位置插入奶牛,如果
初始化为1的话区间就改变了。
check函数遍历每块区间是否可以插入奶牛,传入的x为待插入的奶牛到上一头奶牛的距离,当可插入的数量>=2时即为可以插入。
二分则是为了寻找最大距离,当可以放得下时增大距离,放不下时缩小距离。
题目代码
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
int n, m;
int a[N];
char s[N];
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 >> s + 1;
for(int i = 1; i <= n; i ++ )
if(s[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]);
int ans = 0;
while(l <= r)
{
int mid = l + r >> 1;
if(check(mid))
{
ans = mid;
l = mid + 1;
}
else r = mid - 1;
}
cout << ans << endl;
return 0;
}
作者:vacilie
出处:https://www.cnblogs.com/vacilie/p/16046292.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】