题目描述
n只猴子选大王,选举办法如下:从头到尾1,2,3报数,凡报3的退出,余下猴子第二轮从尾到头1,2,3报数,凡报3的退出...如此类推,当剩下两只猴子时,取这时报1的为王,若想当猴王,请问当初应占据什么位置?
输入格式
一个数 n,表示n只猴子 n<=1000 .
输出格式
一个整数,表示猴王的位置,也就是最后一个出队的猴子的位置。
样例数据
input
3
===================下面为第二组======================
7
output
2
===================下面为第二组======================
2
数据规模与约定
时间限制:1s
空间限制:256MB
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[1010];
int n;
cin>>n;
for(int i=1;i<=n;i++) a[i]=i;
if(n==3) {cout<<2<<endl; return 0;}
while(n>1)
{
for(int i=1;i<=n;i++)
if(i%3==0) a[i]=0;
for(int i=1;i<=n;i++)
{
if(a[i]==0)
for(int j=i;j<n;j++) a[j]=a[j+1];
n--;
}
if(n%3==1)
{
for(int i=n;i>=1;i--)
if(i%3==2) a[i]=0;
}
else if(n%3==2)
{
for(int i=n;i>=1;i--)
if(i%3==0) a[i]=0;
}
else if(n%3==0)
{
for(int i=n;i>=1;i--)
if(i%3==1) a[i]=0;
}
for(int i=1;i<=n;i++)
{
if(a[i]==0)
for(int j=i;j<n;j++) a[j]=a[j+1];
n--;
}
}
cout<<a[1]<<endl;
return 0;
}
虽然自己觉得挺对,但是总是有问题,求大佬指点