P1145

约瑟夫

题目描述

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

输入格式

一行一个整数 k

输出格式

一行一个整数 m

样例 #1

样例输入 #1

3

样例输出 #1

5

样例 #2

样例输入 #2

4

样例输出 #2

30

提示

0<k<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 @   hey在干嘛  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示