一:杭电原题摘录
http://acm.hdu.edu.cn/game/entry/problem/show.php?chapterid=2§ionid=2&problemid=2
二.题目分析
1.约瑟夫环问题 原题https://baike.baidu.com/item/%E7%BA%A6%E7%91%9F%E5%A4%AB%E9%97%AE%E9%A2%98/3857719?fr=aladdin
n个人想玩残酷的死亡游戏,游戏规则如下: n个人进行编号,分别从1到n,排成一个圈,
顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。
请输出最后一个人的编号。
#include <cstdio>
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int s=0;
for (int i=2; i<=n; i++)
{
s=(s+m)%i;//求最后剩下的人的递推公式
}
printf("%d\n",s+1);
}
return 0;
}
2.约瑟夫环问题变形
就是该题:
输入k 前k个好人后k个坏人,总共2k个人 求最小的m使最后一个坏人死前好人一个不死 由于前k个人都不死,
所以前k的人位置号码不会发生变动,因此(s+1)的位置<k不成立
数据很小只有14 ,暴力枚举加递推公式
三.我的收获
无
四.AC代码
#include <iostream>
#include <cstring>
using namespace std;
int k,a[30],ans[15];
int main()
{
for(int i=1;i<14;i++)
{
int m=1;
memset(a,0,sizeof(a));
int n=2*i;
for(int j=1;j<=i;j++)
{
a[j]=(a[j-1]+m-1)%(n-j+1);
if(a[j]<i)
{
m++;
j=0;
}
}
ans[i]=m;
}
while(cin>>k&&k)
cout<<ans[k]<<endl;
return 0;
}