题解:CF690A2 Collective Mindsets (medium)
CF690A2 解题报告
前言
眼前一黑思维题(确信)。
做完估计都能当心理学专家了。
思路分析
感觉没有什么太好的切入点……
可能可以从小到大依次分析?
那么展现一下各位海盗的内心活动。
为了方便表述,把海盗从 到 排序,从 到 提出方案。和题面中相反,请读者注意区分。
长文预警。
n=1
死不了。
答案为 。
n=2
投赞成票,也死不了。
答案为 。
n=3
如果 3 号死了,那么金币会被 2 号拿走,1 号拿不到。
所以只要给 1 号一枚金币,他就会投赞成票。
答案为 。
n=4
如果 4 号没有金币,并且 4 号死了,那么 3 号也得死,因为 3 号至少要一枚金币才能存活。
所以如果 4 号没有金币,那么 3 号会投赞成票保命。
答案为 。
n=5
如果 5 号死了,那么 4 号会拿走所有金币,3 号拿不到。所以只要给 3 号一枚金币,他就会投赞成票。
如果 4 号拿到金币,他会给 2 号一枚金币,所以 2 号和 4 号是一伙的。
如果 5 号死了,1 号也拿不到金币,所以只要给 1 号一枚金币,他也会投赞成票。
答案为 。
n=6
如果 6 号手里有一枚金币,并且 6 号死了,那么 5 号也得死,所以 5 号会投赞成票保命。
如果 5 号死了,4 号可以拿走金币,3 号拿不到,所以只要给 3 号一枚金币,他就会投赞成票。
答案为 。
n=7
和 相似。
答案为 。
n=8
好玩的来了。
如果 8 号手里没有金币,并且 8 号死了,那么 5 号,6 号,7 号都得死,因为他们手里的金币不够。
所以这 3 个人都会投赞成票保命。
答案为 。
n=9
和 相似。
答案为 。
n=10
如果 10 号手里没有金币,那么 9 号会投赞成票保命。
但是没有用,因为 8 号可以活下来,而其他海盗因为死不了,所以开始杀人,所以 10 号没有金币必死。
如果 10 号手里有一枚金币,那么 8 号就不淡定了,因为此时 6 号因为有一枚金币可以活,他不会再支持 8 号,所以 8 号为了保命也会和 9 号一起投赞成票。
这样,7号,8号,9号都会投赞成票。
因为 6 号会拿走金币,5 号拿不到。所以只要给 5 号一枚金币,他就会投赞成票。
答案为 。
n=11
和 相似。
答案为 。
n=12
如果没有或者有一枚金币,12 号都会死,读者可以自己验证。
如果有两枚金币,10 号会失去 8 号的支持,所以 10 号,11 号都会投赞成票保命。
然后如果 12 号死了,8 号会拿到全部金币,所以只要分别给 6 号,7 号一枚金币,他们都会投赞成票。
答案为 。
n=13
和 相似。
答案为 。
n=14
答案为 ,读者可以自行验证。
n=15
和 相似。
答案为 。
n=16
好玩的又来了。
如果 16 号没有金币,那么 9 号,10 号,11 号,12 号,13 号,14 号,15 号都会投赞成票保命。
答案为 。
总结
应该分析的差不多了。
发现当 是奇数时,因为当前人死了不会有人陪葬,所以他们不得不给 个拿不到金币的人一人一枚金币,来换取他们的赞成票。
当 是偶数时,并不是金币越多越好,有时候金币少会导致别人陪葬,从而获得这些人的保命票。
这样的人的数量变化是有周期规律的。
令 为 的极大值,那么答案为 。
代码实现
想得多了,写的就少。
#include<bits/stdc++.h>
using namespace std;
int n,cnt;
int main(){
cin>>n;
if(n&1) cout<<(n-1)/2;
else{
while((1<<(cnt+1))<=n) cnt++;
cout<<(n-(1<<cnt))/2;
}
return 0;
}
后记
心理学题。
本文作者:Kenma
本文链接:https://www.cnblogs.com/Kenma/p/18689771
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步