POJ 1012:Joseph

原创 2015年07月09日 18:39:33

Joseph
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 50068   Accepted: 19020

Description

The Joseph's problem is notoriously known. For those who are not familiar with the original problem: from among n people, numbered 1, 2, . . ., n, standing in circle every mth is going to be executed and only the life of the last remaining person will be saved. Joseph was smart enough to choose the position of the last remaining person, thus saving his life to give us the message about the incident. For example when n = 6 and m = 5 then the people will be executed in the order 5, 4, 6, 2, 3 and 1 will be saved. 

Suppose that there are k good guys and k bad guys. In the circle the first k are good guys and the last k bad guys. You have to determine such minimal m that all the bad guys will be executed before the first good guy. 

Input

The input file consists of separate lines containing k. The last line in the input file contains 0. You can suppose that 0 < k < 14.

Output

The output file will consist of separate lines containing m corresponding to k in the input file.

Sample Input

3
4
0

Sample Output

5
30

很小的时候就有的约瑟夫问题,就是一群人(人数为n)围成一桌,从1到n标上号,然后来一个数m,每次数到m的人就被淘汰,从下一个人开始再数m个数,数到m的再被淘汰,就这么淘汰去吧。

这题是有n个好人,n个坏人。好人的标号是从1到n,坏人的标号是从n+1到2*n。题目要找一个m,把坏人都淘汰掉,好人一个都不淘汰。

这题的关键在于不要纠结与坏人的标号,不论人数还剩多少,好人的标号始终是1到n,坏人的标号始终在后面。淘汰一个坏人,只需把剩余的人数减1,剩下的坏人把之前淘汰的坏人填补上,穿好他们的标号就好。所以举个例子

6个人:1 2 3 4 5 6

m=5

第一次从1开始数5位,淘汰5,剩余 1 2 3 4 5(6就往前移一位,穿上5的衣服,这样好人就还是标号1 2 3,坏人标号4 5。剩余5个人)

第二次从5开始数5位,淘汰4,剩余 1 2 3 4 (好人标号1 2 3,坏人标号4)

第三次从4开始数5位,淘汰4,剩余1 2 3 ,游戏结束。

为什么不要纠结于坏人的标号呢?因为不容易得出公式啊,现在不计较坏人的标号的话,我得到的公式就是

kill_num=(kill_num+m-1)%rest

所以我记录一个kill的vector,只要每次淘汰的标号大于n或是等于0,即符合标准,我就把它扔进去,什么时候kill的人数等于n了,说明找到的m是正确的,否则就m++,再找。

(找m)代码:

#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;

int people[50];
vector <int> kill;

int main()
{
	int n,k=0;
	while(cin>>n)
	{
		int result=n+1,rest=2*n,kill_num=1;
		int n2=2*n;
		
		memset(people,0,sizeof(people));
		kill.clear();
		while(1)
		{
			if(kill.size()==n)
				break;
			if((result+kill_num-1)%rest==0)
			{
				kill_num=rest;
				rest--;
				kill.push_back(rest);
			}
			else if((result+kill_num-1)%rest<=n)
			{
				kill_num=1;
				kill.clear();
				rest=n2;
				result++;
			}
			else
			{
				kill_num=(result+kill_num-1)%rest;
				rest--;
				kill.push_back(kill_num);
			}
		}
		cout<<result<<endl;
	}

	return 0;
}


最终打表代码:

#include <iostream>
using namespace std;

int main()
{
	int result[16];
	int n;
	
	result[1] = 2;
	result[2] = 7;
	result[3] = 5;
	result[4] = 30;
	result[5] = 169;
	result[6] = 441;
	result[7] = 1872;
	result[8] = 7632;
	result[9] = 1740;
	result[10] = 93313;
	result[11] = 459901;
	result[12] = 1358657;
	result[13] = 2504881;
	result[14] = 13482720;
	
	while(cin>>n && n)
	{
		cout<<result[n]<<endl;
	}
	return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

POJ1012Joseph解题报告

约瑟夫环 POJ 1012 Joseph解题报告
  • Dafang_Xu
  • Dafang_Xu
  • 2015年10月22日 21:19
  • 842

POJ 1012 Joseph题解与心得

POJ 1012 Joseph题解与心得   2010-06-06 13:15    这几天都在收集一些DP的资料,但读了一些入门的资料后我发现DP比我想象中的还要难入门,主要是DP问题各概念都比较抽...
  • leesofte
  • leesofte
  • 2010年06月06日 15:57
  • 663

POJ-1012-Joseph-暴力/模拟

约瑟夫问题 前k个好人和后k个坏人排在一起 要求先删除全部坏人才能删除好人 暴力vector模拟一下。。打表交。。 int ans[15]={-1,2,7,5,30,169...
  • viphong
  • viphong
  • 2015年11月10日 18:45
  • 175

poj 1012 Joseph

链接:http://poj.org/problem?id=1012 题意:约瑟夫问题的变形,给出数据k表示有k个好人k个坏人围成一圈,好人在前面,求出一个数m(每数到第m个人,这个人就被处死)使所有...
  • fallenfall
  • fallenfall
  • 2013年09月29日 14:12
  • 449

Poj 1012 Joseph

import java.io.*; import java.math.BigInteger; import java.util.*; public class Main { public ...
  • dyhu083
  • dyhu083
  • 2013年10月30日 18:36
  • 293

POJ 1012 Joseph

#includeint Check(int k, int m){    int i, start, len;    len = 2*k;    start = 0;    for(i=1; ik; i...
  • luxuejuncarl
  • luxuejuncarl
  • 2007年04月29日 00:25
  • 1120

POJ - 1012 Joseph

题意:约瑟夫环的问题,前K个人是好人,后K个人是坏人,求最小的M,枚举M,套用公式ans[i]=(ans[i-1]+m-1)%(n-i+1),报数是从1开始的 #include #include ...
  • u011345136
  • u011345136
  • 2013年11月23日 16:17
  • 631

poj 1012 Joseph解题报告

题目链接http://acm.pku.edu.cn/JudgeOnline/problem?id=1012这题的大意就是2*k个人围成一个圆圈从1开始报数报到到m的杀死,要使得编号为k——2*k-1的...
  • xiancaifu
  • xiancaifu
  • 2010年08月09日 13:51
  • 453

[POJ][1012]Joseph

Description The Joseph's problem is notoriously known. For those who are not familiar with the or...
  • oqqShaw123
  • oqqShaw123
  • 2014年05月14日 22:42
  • 808

Joseph - POJ 1012 打表

Joseph Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 47228   Accept...
  • u014733623
  • u014733623
  • 2014年06月05日 12:13
  • 585
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 1012:Joseph
举报原因:
原因补充:

(最多只允许输入30个字)