书院主持人 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);
}
}
}