您的位置:首页 > 其它

51Nod 1073 约瑟夫环

2018-01-24 13:59 351 查看
题意:N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数。问最后剩下的人的编号。例如:N = 3,K = 2。2号先出列,然后是1号,最后剩下的是3号。

解题思路:约瑟夫环经典问题,递推方程f(n)=(f(n-1)+k)%n,f(1)=0,由于f(1)=0说明从0开始报数,而题干说的是从1开始报,所以直接在结果上加1就好

代码:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <queue>
#include <vector>
#include <map>
#include <set>
using namespace std;

#define INF 0x3f3f3f3f
const int maxn=1e6+10;
int f[maxn];
int main()
{
int n,k;
while(scanf("%d%d",&n,&k)==2)
{
f[1]=0;
for(int i=2;i<=n;i++){
f[i]=(f[i-1]+k)%i;
}
printf("%d\n",f
+1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: