题目链接:P2678 跳石头
很简单的二分查找,可悲的是我并不会。
不过题解贴心的写得很清楚(学会了套路)
二分一次判断一次,复杂度是(O(nlogl)),可以通过此题。
(Code:)
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int l,m,n;
int a[50005],ans;
int judge(int x)
{
int cnt=0,last=0;
for(int i=1;i<=n+1;i++)
{
if(a[i]-a[last]<x)
{
cnt++;
}
else last=i;
}
if(cnt>m) return 0;
else return 1;
}
int main()
{
scanf("%d%d%d",&l,&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
a[n+1]=l;
int ll=1,r=l;
while(ll<=r)
{
int mid=(ll+r)>>1;
if(judge(mid)) ans=mid,ll=mid+1;
else r=mid-1;
//printf("%d %d
",mid,judge(mid));
}
printf("%d
",ans);
return 0;
}
变量真卡人,开始写了两个(l),还对了一个点......