解释全都放在代码里了
代码
#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;
}