1875 丢手绢

1875 丢手绢

六一儿童节到了,小朋友们在玩丢手绢的游戏。总共有C个小朋友,编号从1到C,他们站成一个圈,第i(1<i<=C)个人的左边是i-1,第1个人的左边是C。第i(1<=i<C)个人的右边是i+1,第C个人的右边是1。然后再给出一个常数E。刚开始的时候1号小朋友拿着手绢,接下来游戏开始,在游戏的每一轮,拿手绢的人会把手绢向右边传递E-1个人,拿到手绢的人退出圈,把手绢递给他右边的小朋友,剩下的人向中间挨紧,把圈中的空位补满。然后开始下一轮,如此往复。直到圈中只剩一个人。比如C=6,E=5的时候,出圈的顺序是5,4,6,2,3,最后1号小朋友留在了圈中。

现在有2G个小朋友,要求一个最小的常数E,使得这2G个小朋友玩了G轮游戏之后,出圈的小朋友编号刚好是G+1到2G。

Input

多组测试数据。
每一行给出一个整数G( 0 < G < 14),G=0的时候表示输入结束。

Output

输出多行,表示每一组数据的答案。

Input示例

3
4
0

Output示例

5
30

此题我没有发现任何技巧,所以我选择打表 12,13跑了有半个小时还要多

 1 #include <cctype>
 2 #include <cstdio>
 3
 4 const int MAXN=30;
 5
 6 int n;
 7
 8 int next[MAXN],from[MAXN],f[MAXN];
 9
10 inline bool pd(int num,int x) {
11     for(int i=2;i<2*x;++i) next[i]=i+1,from[i]=i-1;
12     next[1]=2;from[1]=x*2;next[2*x]=1;from[x*2]=2*x-1;
13     int i=1,t=1,s=2*x;
14     while(s>x) {
15         if(t==num) {
16             if(i<=x) return false;
17             int p=from[i];
18             int nx=next[i];
19             next[p]=nx;from[nx]=p;
20             --s;
21             t=1;i=nx;
22         }
23         i=next[i];
24         ++t;
25     }
26     return true;
27 }
28
29 int hh() {
30     f[1]=2;
31     for(int i=2;i<=14;++i) {
32         for(int j=i+1;;++j)
33           if(pd(j,i)) {f[i]=j;printf("%d ",f[i]);break;}
34     }
35     for(int i=1;i<=14;++i) printf("%d ",f[i]);
36     return 0;
37 }
38
39 int sb=hh();
40 int main(int argc,char**argv) {;}

打表程序

 1 #include <cctype>
 2 #include <cstdio>
 3
 4 const int MAXN=14;
 5
 6 int n;
 7
 8 int f[MAXN]={0,2,7,5,30,169,441,1872,7632,1740,93313,459901,1358657,2504881};
 9
10 int hh() {
11     while(scanf("%d",&n)) {
12         if(n==0) break;
13         printf("%d\n",f[n]);
14     }
15     return 0;
16 }
17
18 int sb=hh();
19 int main(int argc,char**argv) {;}

标程

时间: 2024-12-25 20:02:22

1875 丢手绢的相关文章

1875 丢手绢 (模拟+打表)

题意就不说了. 不会之前,还是感觉挺难的. 思路:n表示多少人,e表示传的长度,刚开始从1传给n+1~n+n:那么n为多少合适呢? 先是枚举e,e是无上界限的,用一个非常大的数来表示哦. s表示当前的位置, s+e之后  整个圈all--:而s也要--的:(相对位置是不变的)然后再加e,求余(数学的周期一样) 表示的新位置我们就需要判断了,符合在n+1-n+n就继续,否则枚举下一个e,如果一直跳到新的位置,并且都满足条件 那么,当圈的大小变成n时,说明e是正确的. 怎么样是不是很裸的模拟 ac代

算法题之丢手绢问题

n个人围成一圈,顺序排号,从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的多少号? public class DiuShouJuan { public static void main(String[] args) { System.out.println(result(4)); } public static int result(int n){ boolean[] arr = new boolean[n]; for (int i = 0; i < arr.len

Algorithm One Day One -- 约瑟夫环(丢手绢问题)

算法是编程的灵魂,是编程思想的精髓----Algorithm One Day One /******************************************************************** created:2015年1月20日 23:06:46 author: Jackery purpose: Joseph problem *********************************************************************

ZJNU 1531 - 丢手绢--中级

可以将相同的人数分块存在数组gp中先 例如RRGGGRBBBBRR 则gp[1~5]={2,3,1,4,2} 首先可以知道,如果要让没有相邻的相同,只需要每个gp[i]/2向下取整即可得出最少需要改变的个数 例如RGGGR,只看G,只需要改变中间的G即可 例如RGGGGR,只看G,可以选择改变1和3或者2和4位置的G. 最后,考虑首尾成环对答案的影响 例如RRRGRRR gp[1~3]={3,1,3} 则由上面的说法可以得到答案为3/2+1/2+3/2=1+0+1=2人 但实际上首尾连接后有6个

用ArrayList(解决约瑟夫问题)

约瑟夫问题(Josephus problem)又称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,约瑟夫问题类似问题又称为约瑟夫环."丢手绢问题". 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身

模板题-六一儿童节-51nod1875

六一儿童节到了,小朋友们在玩丢手绢的游戏.总共有C个小朋友,编号从1到C,他们站成一个圈,第i(1<i<=C)个人的左边是i-1,第1个人的左边是C.第i(1<=i<C)个人的右边是i+1,第C个人的右边是1.然后再给出一个常数E.刚开始的时候1号小朋友拿着手绢,接下来游戏开始,在游戏的每一轮,拿手绢的人会把手绢向右边传递E-1个人,拿到手绢的人退出圈,把手绢递给他右边的小朋友,剩下的人向中间挨紧,把圈中的空位补满.然后开始下一轮,如此往复.直到圈中只剩一个人.比如C=6,E=5的

约瑟夫问题-Josephus--及实例说明

//---我保证所有的代码都已经经过验证---// 类似约瑟夫的问题又称为约瑟夫环.又称“丢手绢问题”. 这个问题来自于这样的一个关于著名犹太历史学家 Josephus传说: 在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止.然而Josephus 和他的朋友并不想遵从.首先从一个人开

约瑟夫问题的一种解法

/* * 问题原型 */ 41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止.约瑟夫将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏. /* * 问题分析 */ 这个问题还有一种描述为丢手绢问题,因此代码命名以shoujuan 由于最近在学习java,因此决定用java链表来完成这个问题.设计一个循环链表,将41个人链接起来,选定一个人作为起始,逢3进行remove动作. 需要设计类: shoujuan,用以表

杭电OJ(HDU)-ACM Steps-Chapter Two-《Biker&#39;s Trip Odometer》《Climbing Worm》《hide handkerchief》《Nasty Hac》

1.2.1 Biker's Trip Odometer #include<stdio.h> #include<math.h> const double PI=acos(-1.0); /* 计算题,根据公式做就行,PI*d*r/(12*5280);res1/t*3600; Sample Input 26 1000 5 27.25 873234 3000 26 0 1000 Sample Output Trip #1: 1.29 928.20 Trip #2: 1179.86 1415