您的位置:首页 > 其它

POJ 1012--Joseph

2017-07-06 23:39 357 查看

题意

题目的大概意思是,有2*K个人站一排,左边是好人,右边是坏人,现从最左边开始报数,每报到m便杀掉此人,求m为多少时能保证每次都杀到坏人,直到杀完坏人为止。

分析

先考虑最后只剩下K+2个人的时候,此时要么杀第k+1个要么杀k+2个,那么最后一轮报数时就可能从第k+1(原k+1号被杀,k+2号变为k+1)个人或者第1个人(原k+2被杀)开始报数。因此便有(k+1+m-1)%(k+1)=0或(1+m-1)%(k+1)=0,所以m为n(k+1)或者n(k+1)+1。另外每次计算所得需要存储下来,会有重复的k输入。

代码如下:

Memory: 248K Time: 32MS Length:66LINES

#include<iostream>
using namespace std;
int main()
{
int Box[14] = { 0 };
int temp = 0;
while (cin >> temp&&temp != 0)
{
if (Box[temp] != 0)
{
cout << Box[temp] << endl;
continue;
}
int j = 1;
while (true)
{
int m = j * (temp + 1);
int start = 1;
int kill = 0;
int sum = 2 * temp;
while (sum > temp)
{
kill = (m + start - 1) % sum;
if (kill == 0)
{
start = 1;
kill = sum;
}
else        start = kill;
if (kill <= temp)            break;
--sum;
}
if (kill == temp + 1)
{
Box[temp] = m;
cout << m << endl;
break;
}

m = j * (temp + 1) + 1;
start = 1;
kill = 0;
sum = 2 * temp;
while (sum > temp)
{
kill = (m + start - 1) % sum;
if (kill == 0)
{
start = 1;
kill = sum;
}
else            start = kill;
if (kill <= temp)            break;
--sum;
}
if (kill == temp + 1)
{
Box[temp] = m;
cout << m << endl;
break;
}
++j;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj