您的位置:首页 > 其它

POJ-1012 Joseph

2015-02-13 20:17 281 查看
题目大意:约瑟夫环问题,前k人为好人,后k人为坏人,选取最小报数m,使得所有坏人先被剔除。

题目链接:http://poj.org/problem?id=1012

模拟即可,模拟过程中i表示淘汰过程的轮数(取值1~k),ans表示尝试的报数,成功时结束循环ans即为结果。数组a[]记录每轮淘汰人的原始编号,故模拟过程可表示为a[i]=(a[i-1]+ans-1)%(2*k-i+1)(公式比较简单,证明略)。

另外此题需要打表记录,否则会TLE,数据中有重复计算同一k值结果的情况。

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <math.h>
#include <algorithm>

using namespace std;

#define MAXN 30

int a[MAXN];
int table[14];

int main()
{
int k;
while(scanf("%d",&k),k)
{
if(table[k])
{
printf("%d\n",table[k]);
}
else
{
int ans=k;
int i=1;
while(i<=k)
{
a[i]=(a[i-1]+ans-1)%(2*k-i+1);
if(a[i]<k)
{
i=1;
ans++;
}
else i++;
}
printf("%d\n",table[k]=ans);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj POJ1012 模拟