蓝桥杯 算法提高VIP试题JAVA题解:书院主持人

书院主持人 JAVA题解

资源限制 时间限制:1.0s 内存限制:256.0MB
问题描述:
  北大附中书院有m个同学,他们每次都很民主地决策很多事情。按罗伯特议事规则,需要一个主持人。同学们民主意识强,积极性高,都想做主持人,当然主持人只有一人。为了选出主持人,他们想到了一个办法并认为很民主。方法是:
  大家围成一圈,从1到m为每个同学编号。然后从1开始报数,
数到n的出局。剩下的同学从下位开始再从1开始报数。最后剩下来的就是主持人了。现在已经把同学从1到m编号,并约定报数为n的出局,请编程计算一下,哪个编号的同学将会成为主持人。
输入格式   一行,由空格分开的两个整数m n。 输出格式   一个整数,表示主持人的编号 样例输入 15 3 样例输出 5 样例输入
200 55 样例输出 93 数据规模和约定   10000>m>0; 100>n>0;   时间限制1.0秒

class id{
     
    int id;
    int turn;
}
class test{
     
    public static void main(String[] args) {
     
        Scanner sc=new Scanner(System.in);
        int m=sc.nextInt();
        int n=sc.nextInt();
        id[] nums = new id[m];
        for (int i=0;i<m;i++){
     
            nums[i] = new id();//初始化所有id
            nums[i].id=i+1;
        }
        //如果n=1,那么肯定剩下最后一个人(别问我为什么能想到这个例子,问蓝桥杯系统)
        if(n==1){
     
            System.out.println(m);
            return;
        }
        //初始化编号为1的人的数到的数为1,循环从第二个人开始
        nums[0].turn=1;
        int turn=1;
        int key=m;//key记录人数
        for (int j=1;j<m;j++){
     
        //如果该人已经被淘汰,那么直接进行下一次循环
            if(nums[j].turn==-1) {
     
            //如果已经数到末尾
                if(key!=1&&j==m-1) {
     
                    j = -1;
                }continue;
            }
            //更新该人应数到的数
            else turn=turn+1;
            nums[j].turn=turn;
            //如果是n的倍数,那么设置为-1表示被淘汰
            if(turn%n==0){
     
                nums[j].turn=-1;
                //重新数
                turn=0;
                //记录剩下的人数
                key--;
            }
            if(key!=1&&j==m-1){
     
                j=-1;
            }
        }
        for (id i :nums) {
     
            if (i.turn != -1) System.out.print(i.id);
        }
    }
}

你可能感兴趣的:(竞赛题解)