洛谷P1145 约瑟夫

解释全都放在代码里了


代码

#include<bits/stdc++.h>
using namespace std;
int k;
int main()
{
    cin>>k;
    int flag=1;
    int m=k;
    int vis;
    while(flag==1)
    {
        m++; //每开启一次新的循环m++
        vis=0; //指针的初始为0
        for(int i=0;i<k;i++) //因为k个好人站一起 k个坏人站一起 所以我们只需要判断k次,保证这k个好人都不出列的时候 结果成立
        {
            vis=(vis+m-1)%(2*k-i);//下一次出列的人的序号 vis+m-1是上一次出列的人的序号加下一次数的数 最后减去1(数学思想)
                                  //2k-i是总人数减去出列人数
                                  //所以(vis+m-1)%(2*k-i)是下一次出列的人的序号
            if(vis<k) //如果出列的这个人小于k 就说明不符合条件,进行下一个m的判断
                break;
            if(i==k-1) //判断达到最后一个人 说明符合条件 又由于m是从小到大开始判断的 所以第一个找到的符合条件的m就是最小的m
                flag=0;
        }
    }
    cout<<m;
    return 0;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值