主页 > 电脑硬件  > 

NC2227_约瑟夫环

NC2227_约瑟夫环

题解:

import java.util.Scanner;  ​  public class Main {      public static void main(String[] args) {          Scanner sc = new Scanner(System.in);          int n = sc.nextInt();          int k = sc.nextInt();          int m = sc.nextInt();          int set = 0;          for(int i = 2;i <= n;i ++){              set = (set + m) % i;         }          System.out.println((set + k)%n);     }  }

解题思路:

n:总人数

k:开始报数的人的编号

m:每次数到m的人出队

set:记录每次循环后剩余人的位置偏移量

位置偏移量的概念:在每一轮报数结束后,由于有人出队,剩下的人的位置会发生变化。位置偏移量表示的是由于出队操作导致最后一个人位置变化的量。这个量在每一轮中累加,并用于计算下一轮结束后最后一个人的新位置。

初始化:首先创建一个Scanner对象来读取输入的值,包括总人数n、起始编号k和报数的最大值m。

计算过程:

使用一个变量set来记录每轮报数后剩余人的位置偏移量。

从第二个人开始(即i=2),逐个计算到第n个人。

在每一轮中,更新set的值为(set + m) % i。这个公式的含义是:上一轮结束时的位置加上本轮需要报数的次数m,然后对当前剩余的人数i取模,得到新的位置偏移量。

输出结果:

最后,通过(set + k ) % n计算出大王的编号。这里(set + k )是将0-based索引转换为1-based索引,然后对n取模确保结果在合法范围内,最后加1是因为Java中的数组是从0开始的,而题目要求的是从1开始的编号。

标签:

NC2227_约瑟夫环由讯客互联电脑硬件栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“NC2227_约瑟夫环