And Then There Was One
Time Limit: 5000MS   Memory Limit: 65536K
Total Submissions: 4873   Accepted: 2598

Description

Let’s play a stone removing game.

Initially, n stones are arranged on a circle and numbered 1, …, n clockwise (Figure 1). You are also given two numbers k and m. From this state, remove stones one by one following the rules explained below, until only one remains. In step 1, remove stone m. In step 2, locate the k-th next stone clockwise from m and remove it. In subsequent steps, start from the slot of the stone removed in the last step, make k hops clockwise on the remaining stones and remove the one you reach. In other words, skip (k − 1) remaining stones clockwise and remove the next one. Repeat this until only one stone is left and answer its number. For example, the answer for the case n = 8, k = 5, m = 3 is 1, as shown in Figure 1.


Initial state

Step 1

Step 2

Step 3

Step 4

Step 5

Step 6

Step 7

Final state
 

Figure 1: An example game

Initial state: Eight stones are arranged on a circle.

Step 1: Stone 3 is removed since m = 3.

Step 2: You start from the slot that was occupied by stone 3. You skip four stones 4, 5, 6 and 7 (since k = 5), and remove the next one, which is 8.

Step 3:
You skip stones 1, 2, 4 and 5, and thus remove 6. Note that you only
count stones that are still on the circle and ignore those already
removed. Stone 3 is ignored in this case.

Steps 4–7:
You continue until only one stone is left. Notice that in later steps
when only a few stones remain, the same stone may be skipped multiple
times. For example, stones 1 and 4 are skipped twice in step 7.

Final State: Finally, only one stone, 1, is on the circle. This is the final state, so the answer is 1.

Input

The input consists of multiple datasets each of which is formatted as follows.

n k m

The
last dataset is followed by a line containing three zeros. Numbers in a
line are separated by a single space. A dataset satisfies the following
conditions.

2 ≤ n ≤ 10000, 1 ≤ k ≤ 10000, 1 ≤ mn

The number of datasets is less than 100.

Output

For
each dataset, output a line containing the stone number left in the
final state. No extra characters such as spaces should appear in the
output.

Sample Input

  1. 8 5 3
  2. 100 9999 98
  3. 10000 10000 10000
  4. 0 0 0

Sample Output

  1. 1
  2. 93
  3. 2019

Source

题目描述 : n个数排成一圈,第一次删除,以后每数k个数删除一次。求最后一次被删除的数。
假设数字标号为0,1,2,3,,,n-1,。第一次删除的数是k,那么还剩0,1,2,3,,,k-1,k+1,k+2,,,,n-1;
那么问题就转化为求这n-1个数,最后一次被删除的数?,最优子结构,定义状态f[n]代表对n个数进行操作,最后一次被删除的数。
我们需要重新对这n-1个数重新编号,k+1,k+2,k+3,,,n-1,0,1,2,3,4, ,,k-1,重新编号为,0,1,2,3,4,5,,,,n-1.
f[n]与f[n-1]有什么关系呢?f[n]=(f[n-1]+k)%n;因为只是重新编号,所以我们只需将n-1个数所求的最后一个数的序号转化为n个数要求的最后一个数的序号.
题目要求第一次删除的是m,那么我们考虑-k+1,开始数k个数,那么第一次删除的就是0号元素,而且如果0号元素是m的话,那么f[n]号元素就为f[n]+m.
int answer=(m-k+1+f[n])%n;
if(answer<=0)
answer+=n;
不能写成(answer+n)%n,因为answer==0,n%n==0.
  1. #include <iostream>
  2. #include <cstdio>
  3. //#include <strng>
  4. #include <cstring>
  5. using namespace std;
  6.  
  7. int n,m,k;
  8. int f[];
  9. void init()
  10. {
  11. memset(f,,sizeof(f));
  12. }
  13.  
  14. void solve()
  15. {
  16.  
  17. for(int i=;i<=n;i++)
  18. f[i]=(f[i-]+k) % i;
  19. int answer;
  20. answer=(m-k++f[n]) % n;
  21. if(answer<=)
  22. answer=(answer+n)%n; //不能这么写,如果answer==0,答案就为0了
  23. printf("%d\n",answer);
  24.  
  25. }
  26.  
  27. int main()
  28. {
  29.  
  30. // freopen("test.txt","r",stdin);
  31. while(~scanf("%d%d%d",&n,&k,&m))
  32. {
  33. if(n== && m== && k==)
  34. break;
  35. init();
  36. solve();
  37. }
  38.  
  39. return ;
  40. }
 

poj 3517(约瑟夫环问题)的更多相关文章

  1. Joseph POJ - 1012 约瑟夫环递推

    题意:约瑟夫环  初始前k个人后k个人  问m等于多少的时候 后k个先出去 题解:因为前k个位置是不动的,所以只要考虑每次递推后的位置在不在前面k个就行 有递推式 ans[i]=(ans[i-1]+m ...

  2. (顺序表的应用5.4.3)POJ 1012(约瑟夫环问题——保证前k个出队元素为后k个元素)

    /* * POJ-1012.cpp * * Created on: 2013年10月31日 * Author: Administrator */ #include <iostream> # ...

  3. Poj 3517 And Then There Was One(约瑟夫环变形)

    简单说一下约瑟夫环:约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个 ...

  4. POJ 3517 And Then There Was One( 约瑟夫环模板 )

    链接:传送门 题意:典型约瑟夫环问题 约瑟夫环模板题:n个人( 编号 1-n )在一个圆上,先去掉第m个人,然后从m+1开始报1,报到k的人退出,剩下的人继续从1开始报数,求最后剩的人编号 /**** ...

  5. POJ 2359 Questions(约瑟夫环——数学解法)

    题目链接: http://poj.org/problem?id=2359 题意描述: 输入一个字符串 按照下面的规则,如果剩下的最后一个字符是'?',输出"Yes",如果剩下的最后 ...

  6. poj 1012 &amp; hdu 1443 Joseph(约瑟夫环变形)

    题目链接: POJ  1012: id=1012">http://poj.org/problem?id=1012 HDU 1443: pid=1443">http:// ...

  7. POJ 2886 Who Gets the Most Candies?(线段树&#183;约瑟夫环)

    题意  n个人顺时针围成一圈玩约瑟夫游戏  每一个人手上有一个数val[i]   開始第k个人出队  若val[k] < 0 下一个出队的为在剩余的人中向右数 -val[k]个人   val[k ...

  8. poj 3517

    题目链接  http://poj.org/problem?id=3517 题意        约瑟夫环  要求最后删掉的那个人是谁: 方法        理解递推公式就行了  考虑这样一组数据  k ...

  9. UVA 1394 And Then There Was One / Gym 101415A And Then There Was One / UVAlive 3882 And Then There Was One / POJ 3517 And Then There Was One / Aizu 1275 And Then There Was One (动态规划,思维题)

    UVA 1394 And Then There Was One / Gym 101415A And Then There Was One / UVAlive 3882 And Then There W ...

随机推荐

  1. Monkey King(左偏树)

    洛谷传送门 每次给出要争吵的猴子a和b,用并查集判断如果他们是朋友输出-1 如果不是,找出a,b在的堆的根A,B,分别合并A,B的左右孩子,再合并一下. 之后把A,B的数据更改一下:权值除以2,左右孩 ...

  2. 2016 Multi-University Training Contest 7 solutions BY SYSU

    Ants 首先求出每个点的最近点. 可以直接对所有点构造kd树,然后在kd树上查询除本身以外的最近点,因为对所有点都求一次,所以不用担心退化. 也可以用分治做,同样是O(NlogN)的复杂度. 方法是 ...

  3. [NOIP1998] 提高组 洛谷P1012 拼数

    题目描述 设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数. 例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213 又如:n=4时,4个整数7,13,4 ...

  4. NOI导刊2010提高(06) 黑匣子

    题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两种: ...

  5. POJ3233:Matrix Power Series

    对n<=30(其实可以100)大小的矩阵A求A^1+A^2+……+A^K,K<=1e9,A中的数%m. 从K的二进制位入手.K分解二进制,比如10110,令F[i]=A^1+A^2+……+ ...

  6. Last Defence - UVA7045

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  7. 标准格式包含: 私有属性 无参构造 有参构造 setter 和getter 需求中的方法 需求一: 员工类Employee 属性:姓名name,工号id,工资salary 行为:显示所有成员信息的方法show() 需求二: 动物类Animal 属性:姓名name,年龄age 行为:吃饭

      // 员工类 public class Employee { private String name; private int id; private double salary; public ...

  8. Mark 创建路径(c#)-动态分段

    http://bbs.esrichina-bj.cn/ESRI/viewthread.php?action=printable&tid=128564 public void CreateRou ...

  9. C\C++中strcat()函数、sprintf函数

    http://blog.csdn.net/smf0504/article/details/52055971 http://c.biancheng.net/cpp/html/295.html

  10. [RxJS] Chain RxJS Operators Together with a Custom `pipe` Function using Array.reduce

    Instead of writing complex operators, it's usually best to write simple, single-purpose operators th ...