7-28 猴子选大王 (20分)
#include<iostream> using namespace std; int a[1001]; /* 模拟法:刚开始圈内所有数的a[i]=-1,表示还未报数 当淘汰了n-1个猴子的时候,表示游戏结束选出了猴王。 一轮一轮去淘汰,每一轮标记上一论报的数字不为3的倍数,这一轮报的数字为3得倍数的猴子---淘汰数+1 */ int main() { int N; cin>>N; for(int i=0;i<=N;i++){ a[i]=-1; } int cnt=1,t=0;//t表示当前报到过3的倍数的人数,cnt表示当前有效报了cnt次 while(t<N-1){//还在报数,未选出猴王 for(int i=1;i<=N;i++){//循环报数 if(a[i]!=0){//表示上一轮报的数字不为3的倍数 a[i]=cnt%3;//a[i]表示这一轮报的数字 if(a[i]==0) t++; cnt++;//有效报数次数加一 } } } for(int i=1;i<=N;i++){ if(a[i]!=0){ cout<<i<<endl; } } return 0; }

浙公网安备 33010602011771号