HDU1210 Eddy's 洗牌问题【规律】

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1210

题目大意:

有2*N张牌,初始序列为1、2、3、…、N、N+1、…、2*N-1、2*N。通过一次洗牌可将

牌洗为N+1、1、N+2、2、N+3、3、N+4、4、…、N+N、N。按新的牌序列这样循环

洗牌,最终可将牌洗成初始序列。那么问题来了:给你整数N,问经过多少次可以将牌洗

为初始序列。

考虑当N = 5的时候,

初始序列为: 1  2  3  4  5  6  7  8  9  10

一次洗牌后: 6  1  7  2  8  3  9  4 10   5

发现1 2 3 4 5的位置都由原来的1 2 3 4 5变为了2 4 6 8 10,即换到2*原来位置的位置。

而6 7 8 9 10的位置都有原来的6 7 8 9 10变为了1 3 5 7 9,即从1开始间隔排列,换到了

(原来位置-N)*2-1的位置。

只考虑1的位置,发现第一次洗牌后:1->2,那么第二次洗牌后1的位置就是初始序列中2

的变化位置:2->4。则1的总体变化位置为1->2->4->8->5->10->9->7->3->6->1

发现:当1的当前位置pos在小于等于N的时候,经过一次洗牌位置变为2*pos,而在大于N

的时候,经过一次洗牌位置变为(pos-N)*2-1。

用一个循环,找到1从位置1通过循环再次到达位置1的次数,也就是洗牌次数。

AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;

int main()
{
    int N;
    while(cin >> N)
    {
        int pos = 2,times = 1;
        while(pos != 1)
        {
            if(pos <= N)
                pos <<= 1;
            else
                pos = ((pos-N)<<1)-1;
            times++;
        }
        cout << times << endl;
    }

    return 0;
}

HDU1210 Eddy's 洗牌问题【规律】

时间: 2024-10-13 11:27:27

HDU1210 Eddy's 洗牌问题【规律】的相关文章

杭电ACM1210——Eddy&#39;s 洗牌问题~~找规律。

例如:n = 3 一开始,序列为1 2 3 | 4 5 6 然后序列为        4 1 5 | 2 6 3 接着为                2 4 6 | 1 3 5 最后为                1 2 3 | 4 5 6 所以m = 3. 找出规律就可以解决了,只需要第一个数,也就是1的位置重新回到位置1,那整个数列就变回开始的序列了. 1的位置 i 小于等于n时,下一个位置是 2 * i :i 大于 n 时,下一个位置是 2 * (i - n)- 1. 下面是AC的代码

hdu 1210 Eddy&#39;s 洗牌问题

Problem Description 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的值. Input 每行一个整数N Output 输出与之对应的M Sa

hdoj 1210 Eddy&#39;s 洗牌问题 【模拟】

题意:中文题,不翻译.. 策略:观察可知,第i张牌 如果小于等于n 那么他的序号就会变为i*2, 如果大于n 那么就会变成(i-n)*2-1  故 只需要模拟下就好了 AC by SWS 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1210 代码: #include<stdio.h> int main() { int n, cur, pre; while(scanf("%d", &n) == 1){ int ans

HDUJ 1210 Eddy&#39;s 洗牌问题

Eddy's 洗牌问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3232    Accepted Submission(s): 2159 Problem Description Eddy是个ACMer,他不仅喜欢做ACM题,而且对于纸牌也有一定的研究,他在无聊时研究发现,如果他有2N张牌,编号为1,2,3..n,n+1,..2n

杭电acm 1210 Eddy&#39;s 洗牌问题

Eddy's 洗牌问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5504    Accepted Submission(s): 3597Problem Description Eddy是个ACMer,他不仅喜欢做ACM题,而且对于纸牌也有一定的研究,他在无聊时研究发现,如果他有2N张牌,编号为1,2,3..n,n+1,..2n.这

洗牌问题(找规律)

Eddy's 洗牌问题 点我 Problem Description 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的值. Input 每行一个整数N Out

bzoj1965 [Ahoi2005]SHUFFLE 洗牌

Description 为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动. 由于Samuel星球相当遥远,科学家们要在飞船中度过相当长的一段时间,小联提议用扑克牌打发长途旅行中的无聊时间.玩了几局之后,大家觉得单纯玩扑克牌对于像他们这样的高智商人才来说太简单了.有人提出了扑克牌的一种新的玩法. 对于扑克牌的一次洗牌是这样定义的,将一叠N(N为偶数)张扑克牌平均分成上下两叠,取下面一叠的第一张作为新的一叠的第一张,然后取上面一叠的第一张作为新的一叠

牛客网-洗牌(网易)

题目描述 洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程. 现在需要洗2n张牌,从上到下依次是第1张,第2张,第3张一直到第2n张.首先,我们把这2n张牌分成两堆,左手拿着第1张到第n张(上半堆),右手拿着第n+1张到第2n张(下半堆).接着就开始洗牌的过程,先放下右手的最后一张牌,再放下左手的最后一张牌,接着放下右手的倒数第二张牌,再放下左手的倒数第二张牌,直到最后放下左手的第一张牌.接着把牌合并起来就可以了. 例如有6张牌,最开始牌的序列是1,2,3,4,5,6.首先分成两组,左手拿

【遇见时光】网易有道2017内推编程-洗牌

洗牌 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description: 洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程. 现在需要洗2n张牌,从上到下依次是第1张,第2张,第3张一直到第2n张.首先,我们把这2n张牌分成两堆,左手拿着第1张到第n张(上半堆),右手拿着第n+1张到第2n张(下半堆).接着就开始洗牌的过程,先放下右手的最后一张牌,再放下左