洛谷2678 跳石头:
算法:贪心+二分
思路 :为求最短距离的最大值,假设初始化为mid,从起点开始往后枚举,依次比较相邻石头的距离,若满足条件a[i]-a[now]<mid,石头搬走,记录一下;不满足枚举下一位;遍历完之后,若超出经费预算,表示搬走的石头多了,表示mid距离设置太大了,应设小点,令right=mid-1;反之,搬走的石头少了,mid距离设置太小了,应设大点,令left=mid+1;重新运算,直到找出平衡点ans=mid。
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int l,n,m,ans,sum,s;
int a[100];
cin>>l>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
int left=0,right=l;
while(left<=right)
{
int mid=(left+right)/2;
sum=0,s=0;
for(int i=1;i<=n;i++)
{
if(a[i]-s<mid) sum++;
else s=a[i];
}
if(sum<=m)
{
left=mid+1;
ans=mid;
}
else right=mid-1;
}
cout<<ans<<endl;
return 0;
}
洛谷2678 跳石头(典型的二分算法)
最新推荐文章于 2023-12-01 18:14:06 发布