用的穷举法,让这些人一直报数,然后超时了,看别人AC的代码直接用的公式,我直接懵了,这是啥,怎么推出来的??
先贴用数组的
#include <cstdio>
#include <iostream>
using namespace std;
int n;
int main(){
while(1){
cin>>n;
if(n==0)
break;
int pp[n]={0};
int num=n;
int i=0;
int res=0;
while(num>1){//圈子里多于一个人一直报数
for(int j=1;j<=3;j++){//循环报数1-3
if(j!=3&&pp[i]!=3){//不是三且这个位置没有被驱逐
pp[i]=j;
res=i+1;
}
else if(j==3&&pp[i]!=3){
pp[i]=3;
num--;//驱逐人
if(num==1)//一旦只有一人,停止报数
break;
}
else if(pp[i]==3){// 这个人已经被驱逐了
j--;//报数指针不能加
}
if(i==n-1){
i=0;//到了最末,下一个到起点
}
else
i++;
}
}
printf("%d\n",res);
// cout<<res<<endl;
}
return 0;
}
我看了公式讲的最好的文章: