码迷,mamicode.com
首页 > 编程语言 > 详细

【剑指offer】圆圈中最后剩下的数字,C++实现

时间:2018-05-09 22:46:33      阅读:249      评论:0      收藏:0      [点我收藏+]

标签:display   cout   胜利   solution   com   下标   bsp   分享图片   round   

原创博文,转载请注明出处!

# 题目

技术分享图片

# 思路

      本题即为典型的约瑟夫问题,通过递推公式解决。

技术分享图片

      第一行表示每个人的下标,现在要从11个人中删除报数为3的人,从图中可以可看出最后7是胜利者。分析其中的规律:

第一轮中,11个人中胜利者7的角标是6;

第二轮中,10个人中胜利者7的角标是3;

第三轮中,9个人中胜利者7的角标是0;

第四轮中,8个人中胜利者7的角标是6;

第五轮中,7个人中胜利者7的角标是3;

第六轮中,6个人中胜利者7的角标是0;

第七轮中,5个人中胜利者7的角标是3;

第八轮中,4个人中胜利者7的角标是0;

第九轮中,3个人中胜利者7的角标是1;

第十轮中,2个人中胜利者7的角标是1;

第十一轮中,1个人中胜利者7的角标是0;

 

从第十一轮中倒推到第一轮:

从第十一轮中推出第十轮的角标数,(0+3)% 2 = 1

从第十轮中推出第九轮的角标数,(1+3)%  3 = 1

从第九轮中推出第八轮的角标数,(1+3)%  4 = 0

从第八轮中推出第七轮的角标数,(0+3)%  5 = 3

从第七轮中推出第六轮的角标数,(3+3)%  6 = 0

懒得写了…….

 

从n个人中每隔m删除一人,递推公式为 f(n,m) = (f(n-1,m))  %  n

 

# 代码

#include <iostream>
using namespace std;

class Solution {
public:
    // n表示多少个人,m表示随机数
    int LastRemaining_Solution(int n, int m)
    {
        // 特殊输入
        if(n == 0 || m < 0) return -1;

        // 递推公式计算
        int res = 0;
        for(int i = 1; i <= n; i++) 
        {
            res = (res + m) % i;
            cout<<res<<endl;
        }
        return res;
    }
};
int main()
{
    int n = 11;
    int m = 3;
    Solution solution;
    solution.LastRemaining_Solution(n,m);
    return 0;
}

【剑指offer】圆圈中最后剩下的数字,C++实现

标签:display   cout   胜利   solution   com   下标   bsp   分享图片   round   

原文地址:https://www.cnblogs.com/wanglei5205/p/9016848.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!