题目描述:
N只猴子选大王,选举办法如下:从头到尾1、2、3报数,凡报3的退出,余下的从尾到头1、2、3报数,凡报3退出;余下的又从头到尾报数,还是报3的退出;依此类推,当剩下的两只猴子时,取这时报数报1的为王。若想当猴王,请问最初占据什么位置?
输入格式:
输入一个数,表示有n只猴子
输出格式:
输出一个数
样例输入:
10
样例输出:
8
提示:
n<=1000
时间限制: 1000ms
空间限制: 128MB
纯手工模拟,没什么可说的。
代码实现:
#include<bits/stdc++.h>
using namespace std;
int n,m,len,s;
bool vis[10001];//标记这只猴子有没有被淘汰
int main(){
cin>>n,len=n;//len代表剩下的猴子有多少只
while(1){
s=0;//第i只猴子报的数
for(int i=1;i<=n;i++){
if(vis[i]==0)s++;//如果这只猴子未出局,则将报的数字加一
if(len==2&&s==1)return cout<<i,0;//如果就剩两只猴子了,且第i只猴子报了1,输出i
if(s==3){//如果数字报到3了
vis[i]=1;//第i只猴子标记表示它已淘汰
s=0;//初始化报的数字
len--;//猴子数量-1
}
}
s=0;
for(int i=n;i>=1;i--){//同理,只是遍历顺序换了一下
if(vis[i]==0)s++;
if(len==2&&s==1)return cout<<i,0;
if(s==3){
vis[i]=1;
s=0;
len--;
}
}
}
return 0;
}