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;
}
题目链接: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 1012 Joseph
- POJ 1012 Joseph
- POJ 1012 Joseph题解与心得
- poj 1012 Joseph(约瑟夫环)
- Joseph - POJ 1012 打表
- POJ1012 Joseph解题报告
- POJ 1012 && HDU 1443 Joseph(约瑟夫问题)
- poj 1012 joseph
- POJ 1012 Joseph
- NYOJ 191 && POJ 1012 Joseph(约瑟夫环问题)
- POJ 1012 Joseph解题报告
- ACM篇:POJ1012--Joseph
- POJ-1012-Joseph-暴力/模拟
- POJ 1012 Joseph
- POJ - 1012 joseph (约瑟夫打表)
- POJ1012 Joseph
- 【POJ】1012 Joseph
- POJ 1012 Joseph 推导,暴力,约瑟夫环,打表 难度:2
- 【Joseph问题】poj1012 Joseph
- POJ 1012 Joseph 笔记 G++