P1145

约瑟夫

题目描述

\(n\) 个人站成一圈,从某个人开始数数,每次数到 \(m\) 的人就被杀掉,然后下一个人重新开始数,直到最后只剩一个人。现在有一圈人,\(k\) 个好人站在一起,\(k\) 个坏人站在一起。从第一个好人开始数数。你要确定一个最小的 \(m\),使得在第一个好人被杀死前,\(k\) 个坏人先被杀死。

输入格式

一行一个整数 \(k\)

输出格式

一行一个整数 \(m\)

样例 #1

样例输入 #1

3

样例输出 #1

5

样例 #2

样例输入 #2

4

样例输出 #2

30

提示

\(0\lt k\lt 14\)

代码如下

#include<bits/stdc++.h>
using namespace std;
int main(){

    int k;
    cin>>k;
    int n=2*k;//总人数
    //从第一个好人开始
    int m=k;
    bool f=true;
    while(f){
       
        f=false;
        int t=0;
        //k次循环每次去除一个坏人
        for(int i=0;i<k;i++){
            int tmp=n-i;//每次数数前的总人数
            t=(t+m)%tmp;//数到人数
            if(t<k){
                f=true;
                m++;
                break;
            };
        }
        
    }
    cout<<m+1;
    return 0;
}
posted @ 2023-11-01 10:24  hey在干嘛  阅读(22)  评论(0)    收藏  举报