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; 
}

 

posted @ 2020-03-11 21:24  saaas  阅读(353)  评论(0)    收藏  举报