HOJ 1017 模拟约瑟夫问题

来源:互联网 发布:win10精简优化工具 编辑:程序博客网 时间:2024/05/19 02:05

题目:http://acm.hit.edu.cn/hoj/problem/view?id=1017

题意:

前K个是好人,后K个是坏人,要求在杀掉第一个好人之前,已经杀掉所有坏人

分析:

模拟一下约瑟夫问题的过程,枚举m,看看是否前K次会杀掉好人,如果会,那么m就不行。

#include<cstdio>int f[15];bool solve(int k,int m){    int s=0,e=k-1;    for(int i=2*k;i>k;i--){        int kill=(m-1)%i;        if(kill>=s&&kill<=e){            return false;        }        s=((s-m)%i+i)%i;        e=((e-m)%i+i)%i;    }    return true;}void init(){    for(int k=1;k<15;k++){        for(int m=k+1;;m++){            if(solve(k,m)){                f[k]=m;break;            }        }    }}int main(){    int n;    init();    while(~scanf("%d",&n)&&n){        printf("%d\n",f[n]);    }    return 0;}


0 0