基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
收藏
关注
N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数。问最后剩下的人的编号。
例如:N = 3,K = 2。2号先出列,然后是1号,最后剩下的是3号。
Input
2个数N和K,表示N个人,数到K出列。(2 <= N, K <= 10^6)
Output
最后剩下的人的编号
Input示例
3 2
Output示例
3
对于约瑟夫问题,比较传统的算法一般效率不高.
1 // #include <bits/stdc++.h> 2 // #define N 1000005 3 // using namespace std; 4 // int people[N]; 5 // int k[N]; 6 // int main(){ 7 // int n,m; 8 // scanf("%d%d",&n,&m); 9 // int step=1; 10 // int index=0; 11 // int count=0; 12 // int ans; 13 // while(count!=n){ 14 // if(step==m){ 15 // count++; 16 // step=0; 17 // people[index]=1; 18 // ans=index+1; 19 // } 20 // index=++index%n; 21 // if(people[index]==0){ 22 // step++; 23 // } 24 // } 25 // printf("%d ", ans); 26 // return 0; 27 // } 28 29 #include <bits/stdc++.h> 30 using namespace std; 31 int main(){ 32 int n,m; 33 scanf("%d%d",&n,&m); 34 int result=0;//当n=1时的情况 35 for(int i=2;i<=n;i++){ 36 result=(result+m)%i; 37 } 38 printf("%d ",result+1); 39 return 0; 40 }