NOJ 1033 约瑟夫问题

来源:互联网 发布:qq游戏 for mac 编辑:程序博客网 时间:2024/06/06 09:23

2016.10.14

【题目描述】
1033.约瑟夫问题(Joseph)

时限:100ms 内存限制:10000K 总时限:1000ms

描述
设有N名同学手拉手围成一圈,自1、2、3、……开始编号,现从1号开始连续数数,每数到M将此同学从圈中拉走, 求最后被拉走的同学的编号

输入
两个正整数M和N
输出
一个正整数,为最后被拉走的同学的编号,最后输出回车

输入样例
5 3
输出样例
4

【解题思路】
这就是传说中的约瑟夫环问题。
从1开始报数,报到m的人会出列,这时第m+1个人编号为1,剩下的n-1个人又组成了一个新的约瑟夫环。如果我们知道了子问题的解,那么就能知道原问题的解。易知剩下最后一个人的编号为1,可以向前推出原问题的解。
考虑原数列: 1,2,…,n
第m-1个人出列:1,2,…,k-1,k+1,…,n (k = m % n)
改变顺序: k+1,k+2,…,n-1
重新编号: 1,2,…., n-1
这样设子问题的解为x’, 易知x’ = x + k = x + m % n = (x + m) % n;

【代码实现】

#include <iostream>using namespace std;int main(){    int n, m;    int f;    cin >> n >> m;    f = 1;    for (int i = 1; i <= n; i++)         f = (f + m) % i;    cout << f + 1 << endl;}

【心得体会】
数学很重要

0 0
原创粉丝点击