看到这个题,想到了二分答案。用二分的方法枚举最小距离x,和前面石块之间距离(变化)大于这个距离的石块就去掉,把去掉的石块数和m作比较,来变换x,最后找到答案; 但是,第一次写的时候,没有想到如果前面的石块被去掉,那么后面的石块在判断距离时,就会受到影响,并不是一成不变的。结果只得了10 fen ; Besides,写一个正确的二分是很困难的对我来说,因为我记好的板子有时对有时错。如果有大神对二分精通,很虔诚的向您请教。
下面是ac代码
#include#include #include #include #include #include #include using namespace std;int len,n,m;int a[50009],d[50009]; int check(int x){ int t=0,last=0;//last记录未被去掉的前一个石块的位置。 for(int i=1;i<=n;i++) { if(a[i]-last >1; if(check(mid)>m) r=mid; //如果去掉的石块大于m,此时答案一定不可以,r=mid,所以最终的r一定不是答案就将答案x向小了枚举。 else l=mid; } printf("%d\n",l);//r一定不是答案,l一直向右逼近,最终到最优解。 return 0;}
#include#include #include #include #include #include #include using namespace std;int len,n,m;int a[50009],d[50009]; int check(int x){ int t=0,last=0; for(int i=1;i<=n;i++) { if(a[i]-last >1; if(check(mid)<=m) l=mid+1; else r=mid-1;//mid是不符合的且偏大,向左移得到最优解 }//因为要求的是满足的最大的,所以要从不满足且偏大的向左移一点点,如果符合,就是最优解了。 printf("%d\n",r); return 0;}