跳石头
P2678 [NOIP2015 提高组] 跳石头 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
佬啊佬啊,我的思路:用数组b去储存它的差分,每一次找到它的最小值,将最小值和它旁边的较小的那个值合并,边界的话就直接合并,总计进行m次合并操作,这个时候再找到它的最小值,就是答案但是如果是枚举找最小值的话会爆掉,所以要考虑二分,甚至更优的解法,下面贴佬的思路和代码:
#include<cstdio> int L,n,m,i,w,l,r,mid,pos,ans,a[55555]; bool ok(int x){ for(pos=w=0,i=1;i<=n;i++)if(a[i]-pos<x)w++;else pos=a[i]; return w<=m; } int main(){ for(scanf("%d%d%d",&L,&n,&m),i=1;i<=n;i++)scanf("%d",&a[i]);a[++n]=L; for(l=1,r=L;l<=r;)if(ok(mid=l+r>>1))ans=mid,l=mid+1;else r=mid-1; printf("%d",ans); }
但是我们需要意识到一个问题,我是一只小蒟蒻,所以看不太懂二分也没有关系对吧qwq;所以意识到了,需要找个时间好好学习一下二分了。。。。
标签:二分,22,int,2023.11,mid,笔记,pos,最小值,ans From: https://www.cnblogs.com/bosssz/p/17849860.html