题解:本题主要考查二分,贪心。本题贪心从左岸开始,移走它小于m的所
有石头,再往后跳一步,循环往复。暴力枚举肯定超时,因为答案求最值并且有一定的范围,所以可以二分。
代码如下:
#include<iostream>
using namespace std;
int l,n,m,leftt,rightt,mid,now,num,sum=0,i;
int a[845734];
int main()
{
cin>>l>>n>>m;
for(i=1;i<=n;i++)cin>>a[i];
leftt=0;rightt=l;
while(leftt<=rightt)
{
mid=(leftt+rightt)/2;//二分
now=0;num=0;
for(i=1;i<=n;i++)
{
if(a[i]-a[now]<mid)num++;
else now=i;}
if(num<=m){sum=mid;leftt=mid+1;}
else rightt=mid-1;
}
cout<<sum;
return 0;
}
本文介绍了一种结合二分与贪心算法解决特定问题的方法。通过从左岸开始,移除小于预设值的所有石头并向前跳跃,循环进行,最终找到满足条件的最大值。使用二分查找优化了暴力枚举的效率。
————二分,贪心&spm=1001.2101.3001.5002&articleId=86727605&d=1&t=3&u=907e14ecb0a74da69113ff3821da9cac)
575

被折叠的 条评论
为什么被折叠?



