题目描述
n只猴子选大王,选举办法如下:从头到尾1,2,3报数,凡报3的退出,余下猴子第二轮从尾到头1,2,3报数,凡报3的退出...如此类推,当剩下两只猴子时,取这时报1的为王,若想当猴王,请问当初应占据什么位置?
#include<bits/stdc++.h>
using namespace std;
int n,sum;
int a[1201],z[1201],y[1201];
int head,tail;
int s,t,w,q;//s起指针的作用,t是计数变量,w是s了几只猴子,q是应s的hz
bool f;
void init()
{
cin>>n;
sum=n;
head=1;
tail=n;
for(int i=1;i<=n;i++)
{
int w,s;
w=i-1;
s=i+1;
if(w==0) w=n;
if(s==n+1) s=1;
z[i]=w;
y[i]=s;
}
}
void hzsb()
{
//统计还有几只猴子
s=head;//下一个猴子tmd我因为这个用出了静态查错大法!!!
t=0;
w=0;
q=sum/3;//计数(3),判断删hz
//头到尾
while(q>w)//s了1/3的hz就结束
{
s=y[s];
t++;
if(t==3)//可怜的第三只hzsb
{//shz
if(z[s]==tail)//尾被s了,换尾
tail=z[z[s]];//shz
y[z[z[s]]]=s;
z[s]=z[z[s]];
sum--;
t=0;
w++;
}
}
w=0;
t=0;
if(sum>=3) s=tail;
q=sum/3;
while(q>w&&sum>=3)
{
s=z[s];
t++;
if(t==3)
{
if(s==tail)//换头
head=y[y[s]];//shz
z[y[y[s]]]=s;
y[s]=y[y[s]];
w++;
sum--;
t=0;
}
}
if(sum>=3) hzsb();//mss,jxs
if(!f) {cout<<z[s];f=1;}
}
int main()
{
init();
hzsb();
return 0;
}