CF1672E-notepad.exe【交互,二分】

1|0正题

题目链接:https://www.luogu.com.cn/problem/CF1672E


1|1题目大意

有一个你不知道的长度为n的序列l,你每次可以询问一个长度w。交互库会返回一个h表示最少能将l分成多少连续段使得每一段[l,r]都满足i=lrli+rlw
但是,如果w<max{li}则会返回0

你需要在n+30次询问内找到一组最小的w×h

1n2000


1|2解题思路

首先w的取值是可能有很多种的,但是h只有可能是1n,一个暴力的想法是对于每个h都二分一个最小的w,但是这样显然搞不定这一题。

但是看这个三十我们肯定是要先二分一个的,考虑二分出h=1时的情况,那么我们就得到了i=1nli+n1,记为S。注意到h每一次增大最多帮我们剩下一个1,也就是询问h时的答案最少是i=1nli+nh=Sh+1

所以对于一个h有用的w当且仅当h×w[Sh+1,S],也就是w=Sh时才有用。

所以对于每一个Sh进行询问就好了。


1|3code

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,ans; int main() { scanf("%d",&n); int l=1,r=n*2000+n-1,h; while(l<=r){ int mid=(l+r)>>1; printf("? %d\n",mid); fflush(stdout); scanf("%d",&h); if(h==1)r=mid-1; else l=mid+1; } ans=l; for(int i=2;i<=n;i++){ printf("? %d\n",l/i); fflush(stdout); scanf("%d",&h); if(h)ans=min(ans,h*(l/i)); } printf("! %d\n",ans); fflush(stdout); return 0; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/16196030.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(48)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示