例一 hdu7393 :
题意:
有 个人,每个人头上有个 之间中的某个数字,每个人都能看到其他所有人的数字,但是看不到自己的数字,求一种整体策略,使得至少 个人猜对自己头上的数字。
解答:
如果直接在 中猜的话概率期望 看样子是符合的,但是太不稳定了,我们要想一种方法使其稳定(让自己知道哪些一定对)。可以发现,答案的总和 始终不变,所以我们可以想到对 进行猜测,因为 太大了,每次猜测每个数字不用这么大,所以可以对 进行猜测(原因在后面)。对于第 个人,我们猜测 因为知道了其他人的数字总和,所以只需要找到数字 使其满足前面的式子,这个 就是我们猜测的值,并且在 中只会存在一个 。可以发现,我们一定会猜到 次正确的 ,也就是猜对 个人头顶的数字。
总结:
这道题通过对猜测进行分组,来使不确定的事确定,让猜测更加稳定。
例二 CF1672E 交互题:
题意:
给你 个单词,每个单词有一个长度 ,你最多可以查询 次,每次给出一个宽度 ,交互器会告诉你需要多少行宽度为 才可以放下所有单词,要求找到使用面积最小的方案,其中一行内放 需要的长度至少是 。
解答:
分析查询次数可以发现近似是 ,可以想到是一次二分加上一次遍历。考虑怎么处理,首先我们需要二分出把单词都放在一行时的长度,也就是 设此值为 ,再考虑高度大于一的情况,我们可以发现当 也就是 时才会有更佳的情况产生。同时因为 所以 。神奇的发现只有 才会出现更佳的情况,所以我们直接遍历 运算每一个对应的 询问,看其返回的 是否是更佳。
code:
#include<bits/stdc++.h>
using namespace std;
const int N=2003;
int main(){
int n;
cin>>n;
int l=1,r=N*N,S;
while(l<=r){
int mid=(l+r)>>1;
cout<<"? "<<mid<<endl;
int h;
cin>>h;
if(h==1){
S=mid;
r=mid-1;
}else l=mid+1;
}
int ans=S;
for(int i=2;i<=n;i++){
cout<<"? "<<(S/i)<<endl;
int h;
cin>>h;
if(h==0) continue;
ans=min(ans,h*(S/i));
}
cout<<"! "<<ans<<endl;
return 0;
}
例三 CF1887E :
题意:
Alice和你玩游戏,有一个 的网格,最开始Alice会在其中 个格子涂上从 到 不一样的颜色,接着你可以选择一个未涂有颜色的格子让Alice在 个颜色里选择一个颜色并涂上并返回她涂的颜色,你最多进行 次操作并且构造出存在四个方格拥有不同颜色且在一个平行于网格边的矩形上。
解答:
将在 涂上颜色 可以看作在点 和 中间连了一条权值为 的边,那么就变成了一个 节点的二分图,现在我们的操作就是在 x,y 之间连一条权值未知的边,目标变成了构造出一个循环长度为4且边权不一样的环。由于存在了 个点,连了 条边,因为二分图没有奇环,所以会出现一个偶数环,我们可以在其中间划一条边,并且端点不是同一颜色,将这个环的大小从 分成大小约是 的两个小环。因为对于这个环上的边颜色互不一样,所以划了一条边之后至少会有一个小环上的边颜色互不一样。一直划下去就会出现目标情况。
例四 CF1270G :
题意:
给你 个整数的序列 对于 满足 。找出一个非空子集,使其和为 ,输出这个子集每个元素的对应位置。
解答:
因为 所以可以转换成 。我们可以发现,对于一个非空子集 ,使其和为 。所以说 肯定有一个对应的点。如果形成一个环,对于环上的点 我们会发现,在环内指向 的点的值是 由上面的式子可知 也就是 因为 肯定有一个对应的点,一个环内节点号不相同,所以这个序列就是满足条件的集合,输出其节点编号就是答案。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现