丢瓶盖做题报告

这道题其实之前就A了,现在再做一遍反而调了一下午。

二分答案的模板和思路都没问题。调的主要是check函数。

话不多说,先看看我第一次和第二次写的check

bool check(int x) {//1 int sum=0; for(int i=2; i<=A; i++) { sum=0; for(int j=1; j<i; j++) { if(a[i]-a[j]>=x) { sum++; } if(sum == B) { return true; } } } return sum>=B; } bool check(int x) {//2 int sum=0; for(int j=1; j<A; j++) { if(abs(a[A]-a[j])>=x) { sum++; } if(sum == B) { return true; } } return sum>=B; }

评价:狗屁不通,题意都理解错了。必须是相邻两个瓶盖之间求距离。而我上面两个做法是先选定一个点,再枚举

除了他以外的所有点。显然是不对的。而且sum的初始值显然是应该为一的。

然后我调了半天,终于挑了一个应该可以保证正确性的check

void check(int num,int x,int p,int sum) { //printf("num=%d sum=%d x=%d last=%d\n",num,sum,x,p); if(pd == true) { return ; } if(num == B) { pd=(sum>=(B-1)); } if(sum >= (B-1)) { pd=true; return ; } for(int i=p+1; i<=A; i++) { if(a[i]-a[p]>=x && p) { check(num+1,x,i,sum+1); } else { check(num+1,x,i,sum); } } }

没错我用了搜索。。。然鹅只得了30pts,其他点全都超时了。

然后我从题解区get到了一个很简单的check

bool check(int x) { //printf("num=%d sum=%d x=%d last=%d\n",num,sum,x,p); int num=1,sum=1; for(int i=2; i<=A; i++) { if(a[i]-a[num]>=x) { num=i; sum++; } if(sum>=B){ return true; } } return sum>=B; }

这个看代码就可以理解为什么了。

然后再二分上也栽了点跟头。

总之给出二分答案的模板

l=0,r=n; while(l+1 < r) { mid=(l+r)>>1; if(check(mid)) { l=mid; } else { r=mid; } } printf("%d",l);

__EOF__

本文作者Kdlyh
本文链接https://www.cnblogs.com/kdlyh/p/17776985.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   加固文明幻景  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示