您的位置:首页 > 其它

UVA 1394 And Then There Was One(约瑟夫环变形)

2016-10-02 23:02 411 查看
一共有n个数,那么设0~n-1代表这些数的位置,从0开始是为了取模方便,每隔k删掉一个数,那么第一次删掉的是k-1,然后重新排列

k -> 0

k+1 -> 1

k+2 ->2

.....

k-2 -> n-2

把右边的位置设为重新编号后的x

从上面的规律中可以看出,目前n-1个人的位置映射到n个人的位置就是(x+k)%n,所以根据这个规律,可以用n-1推出n,用n-2推出n-1,这样就可以建立递推了。

设f[i]为共i个人最后留下来的胜利者,那么根据上面的描述可以定义f[i]=(f[i-1]+k)%i。

但是这里是从m开始的,所以需要变形。

现在是第m个人先失败,所以m-1个人先出去就可以了。//
// main.cpp
// Richard
//
// Created by 邵金杰 on 16/10/2.
// Mail:1016427040@qq.com or jasonshaosjj@gmail.com
// Copyright © 2016年 邵金杰. All rights reserved.
//

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int n,k,m;
while(scanf("%d%d%d",&n,&k,&m)&&(n+k+m))
{
int ans=0;
for(int i=2;i<n;i++)
ans=(ans+k)%i;
ans=(ans+m)%n;
cout<<ans+1<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: