CF690A2 解题报告
前言
眼前一黑思维题(确信)。
做完估计都能当心理学专家了。
思路分析
感觉没有什么太好的切入点……
可能可以从小到大依次分析?
那么展现一下各位海盗的内心活动。
为了方便表述,把海盗从 \(n\) 到 \(1\) 排序,从 \(n\) 到 \(1\) 提出方案。和题面中相反,请读者注意区分。
长文预警。
n=1
死不了。
答案为 \(0\)。
n=2
投赞成票,也死不了。
答案为 \(0\)。
n=3
如果 3 号死了,那么金币会被 2 号拿走,1 号拿不到。
所以只要给 1 号一枚金币,他就会投赞成票。
答案为 \(1\)。
n=4
如果 4 号没有金币,并且 4 号死了,那么 3 号也得死,因为 3 号至少要一枚金币才能存活。
所以如果 4 号没有金币,那么 3 号会投赞成票保命。
答案为 \(0\)。
n=5
如果 5 号死了,那么 4 号会拿走所有金币,3 号拿不到。所以只要给 3 号一枚金币,他就会投赞成票。
如果 4 号拿到金币,他会给 2 号一枚金币,所以 2 号和 4 号是一伙的。
如果 5 号死了,1 号也拿不到金币,所以只要给 1 号一枚金币,他也会投赞成票。
答案为 \(2\)。
n=6
如果 6 号手里有一枚金币,并且 6 号死了,那么 5 号也得死,所以 5 号会投赞成票保命。
如果 5 号死了,4 号可以拿走金币,3 号拿不到,所以只要给 3 号一枚金币,他就会投赞成票。
答案为 \(1\)。
n=7
和 \(n=5\) 相似。
答案为 \(3\)。
n=8
好玩的来了。
如果 8 号手里没有金币,并且 8 号死了,那么 5 号,6 号,7 号都得死,因为他们手里的金币不够。
所以这 3 个人都会投赞成票保命。
答案为 \(0\)。
n=9
和 \(n=7\) 相似。
答案为 \(4\)。
n=10
如果 10 号手里没有金币,那么 9 号会投赞成票保命。
但是没有用,因为 8 号可以活下来,而其他海盗因为死不了,所以开始杀人,所以 10 号没有金币必死。
如果 10 号手里有一枚金币,那么 8 号就不淡定了,因为此时 6 号因为有一枚金币可以活,他不会再支持 8 号,所以 8 号为了保命也会和 9 号一起投赞成票。
这样,7号,8号,9号都会投赞成票。
因为 6 号会拿走金币,5 号拿不到。所以只要给 5 号一枚金币,他就会投赞成票。
答案为 \(1\)。
n=11
和 \(n=9\) 相似。
答案为 \(5\)。
n=12
如果没有或者有一枚金币,12 号都会死,读者可以自己验证。
如果有两枚金币,10 号会失去 8 号的支持,所以 10 号,11 号都会投赞成票保命。
然后如果 12 号死了,8 号会拿到全部金币,所以只要分别给 6 号,7 号一枚金币,他们都会投赞成票。
答案为 \(2\)。
n=13
和 \(n=11\) 相似。
答案为 \(6\)。
n=14
答案为 \(4\),读者可以自行验证。
n=15
和 \(n=13\) 相似。
答案为 \(7\)。
n=16
好玩的又来了。
如果 16 号没有金币,那么 9 号,10 号,11 号,12 号,13 号,14 号,15 号都会投赞成票保命。
答案为 \(0\)。
总结
应该分析的差不多了。
发现当 \(n\) 是奇数时,因为当前人死了不会有人陪葬,所以他们不得不给 \(\frac{n-1}{2}\) 个拿不到金币的人一人一枚金币,来换取他们的赞成票。
当 \(n\) 是偶数时,并不是金币越多越好,有时候金币少会导致别人陪葬,从而获得这些人的保命票。
这样的人的数量变化是有周期规律的。
令 \(k\) 为 \(2^k\le n\) 的极大值,那么答案为 \(\frac{n-2^k}{2}\)。
代码实现
想得多了,写的就少。
#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;
}
后记
心理学题。