zoukankan      html  css  js  c++  java
  • HDU1210 Eddy's 洗牌问题【递推函数+模拟】

    问题链接HDU1210 Eddy's 洗牌问题

    问题简述:Eddy是个ACMer,他不仅喜欢做ACM题,而且对于纸牌也有一定的研究,他在无聊时研究发现,如果他有2N张牌,编号为1,2,3..n,n+1,..2n。这也是最初的牌的顺序。通过一次洗牌可以把牌的序列变为n+1,1,n+2,2,n+3,3,n+4,4..2n,n。那么可以证明,对于任意自然数N,都可以在经过M次洗牌后第一次重新得到初始的顺序。编程对于小于100000的自然数N,求出M的值。

    问题分析

    洗牌过程中,各个编号位置的变化是有规律的,根据这个规律求得递推函数,问题就解决了。

    考虑编号位置1,1次洗牌后位置变为2。考虑编号位置n+1,一次洗牌后位置变为1。

    一般而言,对于编号位置pos,若pos<=n,一次洗牌后其位置变为2*pos;若pos>n,一次洗牌后其位置变为(pos-n)*2-1。

    根据这个规律,只需要考虑编号位置1经过多少次洗牌后又变回1就可以了。

    程序说明:(略)


    AC的C++语言程序如下:

    /* HDU1210 Eddy's 洗牌问题 */
    
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int n;
    
        while(cin >> n) {
            int pos=1, cnt=0;
            for(;;) {
                cnt++;
    
                if(pos <= n)
                    pos <<= 1;      //pos = pos * 2
                else
                    pos = ((pos - n) << 1) - 1;
    
                if(pos == 1)
                    break;
            }
    
            cout << cnt << endl;
        }
    
        return 0;
    }



  • 相关阅读:
    SCAU 9504 面试
    SCAU 9503 懒人选座位
    SCAU 8628 相亲
    SCAU 10691 ACM 光环
    SCAU 8626 原子量计数
    SCAU 10674 等差对
    HDU ACM 1048 The Hardest Problem Ever (水题)
    SCAU 9502 ARDF
    SCAU 10686 DeathGod不知道的事情
    SCAU 8629 热身游戏(高精度)
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563706.html
Copyright © 2011-2022 走看看