洗牌问题(找规律)

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

Output

输出与之对应的M

Sample Input

20

1

Sample Output

20

2

找规律吧 拿N+1来找,经过多少次后能回到原来的位置。比如N=4时,5->1->2->4->8->7->5,所以是6次。

 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 int main()
 5 {
 6     int N;
 7     while(cin>>N)
 8     {
 9         int    n=1;
10         int i=1;
11         while(n!=(N+1))
12         {
13             if(n<=N)
14             {
15                 n=n*2;
16                 i++;
17             }
18             else
19             {
20                 n=(n-N)*2-1;
21                 i++;
22             }
23         }
24         cout<<i<<endl;
25     }
26 }
时间: 2024-10-26 19:38:20

洗牌问题(找规律)的相关文章

杭电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的代码

HDU1210 Eddy&#39;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 一

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.首先分成两组,左手拿

洗牌问题

题目大意: 设 2n 张牌分别标记为 1, 2, ..., n, n+1, ..., 2n,初始时这 2n 张牌按其标号从小到大排列.经一次洗牌后,原来的排列顺序变成 n+1, 1, n+2, 2, ..., 2n, n.即前 n 张牌被放到偶数位置 2, 4, ..., 2n,而后 n 张牌被放到奇数位置 1, 3, ..., 2n-1.可以证明对于任何一个自然数 n,经过若干次洗牌后可恢复初始状态.现在你的的任务是计算对于给定的 n 的值(n≤10^5 ),最少需要经过多少次洗牌可恢复到初始

九章算法面试题38 洗牌的技巧

九章算法官网-原文网址 http://www.jiuzhang.com/problem/38/ 题目 有一副扑克有2n张牌,用1,2,..2*n代表每一张牌,一次洗牌会把牌分成两堆,1,2..n和n+1...2n.然后再交叉的洗在一起:n+1, 1, n+2, 2, - n, 2n.问按照这种技巧洗牌,洗多少次能够洗回扑克最初的状态:1,2,...2n. 解答 以1 2 3 4 5 6为例,洗一次之后为4 1 5 2 6 3 .将两排数组对比看: 1 2 3 4 5 6 4 1 5 2 6 3

YCOJ 洗牌

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

[转]完美洗牌(Perfect Shuffle)问题

[转]原博文地址:https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/02.09.md 完美洗牌算法 题目详情 有个长度为2n的数组{a1,a2,a3,...,an,b1,b2,b3,...,bn},希望排序后{a1,b1,a2,b2,....,an,bn},请考虑有无时间复杂度o(n),空间复杂度0(1)的解法. 题目来源:此题是去年2013年UC的校招笔试题,看似简单,按照题目所要

模拟斗地主洗牌、发牌(含有排序和不排序的)

不排序的: package cn.idcast5; import java.util.ArrayList; import java.util.Collections; //模拟斗地主洗牌发牌 //分析 //A 创建一个牌盒 //B 装牌 //C 洗牌 //D 发牌 //E 看牌 public class Shiyue31 { public static void main(String[] args) { // 创建一个牌盒 ArrayList<String> array = new Arra