codevs 4768 跳石头
傳送門
表示去年不會,二分是啥都不知道,一臉懵逼。
今年再做,雖然知道二分是啥了,但依舊不會,蒙蔽了好幾天,最后還是看了題解。
?
#include<cstdio>
#define M 51000
int n,m,ans=0,L;
int a[M];
void find(int l,int r)
{
if (l>r) return;//我做了無數遍,這句話毀了我一生。
/*
當l<=r時,可能查到的不是最小值中的最大值,繼續向下查詢。
只有當l>r時,說明上一步查的是最大值。
*/
int mid=(l+r+1)/2,k=0,sum=0;
int bj[M];
bj[++k]=0;
for (int i=1;i<=n;i++)
if (a[i]-a[bj[k]]>=mid) bj[++k]=i;
else sum++;
while (L-a[bj[k]]<mid) sum++,k--;
if (sum>m) find(l,mid-1);
else ans=mid,find(mid+1,r);
}
int main()
{
scanf("%d%d%d",&L,&n,&m);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
find(0,L);
printf("%d",ans);
return 0;
}
?
轉載于:https://www.cnblogs.com/sjymj/p/5514057.html
總結
以上是生活随笔為你收集整理的codevs 4768 跳石头的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js时间戳格式化成日期格式
- 下一篇: Android拼图游戏