zoukankan      html  css  js  c++  java
  • 约瑟夫问题总结

    题解在代码里~

    #include <iostream>
    #include <iomanip>
    #include <list>
    using namespace std;
    
    int main()
    {
        int n, k, f[100];
        n = 12; cin>>k;
        //链表做法,复杂度O(n*k)
        list <int> L;
        for(int i = 1; i <= n; i++) f[i] = i, L.push_back(i);
        list<int>::iterator pos = L.begin();
        while(L.size() > 1)
        {
            for(int i = 1; i < k; i++)
            {
                ++pos;
                if(pos == L.end()) pos = L.begin();
            }
            f[*pos] = 0; pos = L.erase(pos); if(pos == L.end()) pos = L.begin();
            for(int i = 1; i <= n; i++) cout<<setw(3)<<f[i]; cout<<endl;
        }
        //若只需求最后出列的人,则可以直接采用动态规划,复杂度O(n)
        /*
            dp[i]表示有i个人时(从0到i重新编号),最后出列的人
            那么如果有i+1个人,我们只需要去掉第一个出列的人,即第k个人就可以转换成i个人的情况
            即dp[i+1] = (k + dp[i])%(i+1)
        */
        int dp[100];
        dp[1] = 0;
        for(int i = 2; i <= n; i++) dp[i] = (dp[i-1] + k)%i;
    
        cout<<setw(3)<<dp[n]+1<<endl;
    }
  • 相关阅读:
    漫谈架构读书笔记
    软件架构怎样进行架构
    大型网站技术架构阅读笔记6
    beta里程碑总结
    团队总结
    用户体验
    小强大扫荡
    团队测试计划
    团队第二次冲刺第十天
    团队第二次冲刺第九天
  • 原文地址:https://www.cnblogs.com/Saurus/p/6127563.html
Copyright © 2011-2022 走看看