【codevs4768】跳石头
误:听说写博客可以涨rp(????)
为了给后来的人留下一笔宝贵的财富,为了这世界的爱与和平,我决定,从今天开始写博客(233333)
作为第一篇博客,今天所写的是跳石头,考试才拿了30分……,听学长讲过之后自己打了一个,标准的二分。
下面放代码
#include<iostream> #include<cstdio> using namespace std; int l1,l,r,n,m,a[50050]; /*int find(int l,int r) { int head=0,tail=0; if(l==r) { return l; } int mid=(l+r)/2; for(int i=1;i<=n;i++) { if(a[i]-a[head]>=mid) { head=i; } else if(a[i]-a[head]<mid) tail++; } //cout<<"tail "<<tail<<endl;; if(tail<m) { r=mid; } else if(tail>m) { l=mid; } find(l,r); }*/ //上面是不成熟的想法,有哪只大佬能帮我改一下,请联系我啊233333333 bool flag(int mid) { int head=0,tail=0; for(int i=1;i<=n;i++) { if(a[i]-a[head]>=mid) { head=i;//说明再用现有的端点已经无法选出被拿走的石头了,需要换端点 } else { tail++;//记录需要拿走的石头数 } if(tail>m) { return 1; } } return 0; } int main() { cin>>l1>>n>>m; a[0]=0; a[n+1]=l1; if(n==0) { cout<<l1; return 0; } for(int i=1;i<=n;i++) { cin>>a[i]; } r=l1; while(l+1<r) { int mid=(l+r)/2; if(flag(mid))//如果石头拿多了,就说明间隔太大,需要缩小右边界 { r=mid; } else//反之需要缩小左边界 { l=mid; } } cout<<l;//最后左右边界一样,任意选一个输出 } /* 25 5 2 2 11 14 17 21*/