[2015年NOIP提高组] 跳石头
[2015年NOIP提高组] 跳石头
思路:本题是最大化最小值问题,考虑二分答案解决。
先写函数确定距离,然后看要搬的石头数满足题意吗。距离确定了,把间距小于确定距离的需要全部搬走。
然后向左或向右再找更小或大的距离,输出就可以了。
代码如下:
#include<iostream>
using namespace std;
int num[2000000];//岩石与起点的距离
int L,N,M;
int judge(int x)//判断预期最短距离M是否符合条件
{
int s=0,cnt=0;//当前距离起点的位置和记录搬走了多少石头
for(int i=1;i<=N+1;i++)//枚举第1到终点的n+1块石头
{
if(num[i]-s<x)//距离比预期短
cnt++;//搬走前面的石头
else
s=num[i];
}
if(cnt>M)//不满足最大的搬运量
return 0;
return 1;
}
int main()
{
int ans;
cin>>L>>N>>M;
num[0]=0;
for(int i=1;i<=N;i++)
cin>>num[i];
num[N+1]=L;
int l=0,r=L,mid;
while(l<=r)
{
mid=(l+r)/2;
if(judge(mid))//mid满足题意,向右找有没有距离更大的
{
l=mid+1;
ans=mid;
}
else//mid不满足题意,向小了的找
r=mid-1;
}
cout<<ans;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!