这个题有个逼格十足的名字,叫做约瑟夫环(至于到底是什么我也不知道/(ㄒoㄒ)/~~)。但是但就这个题来讲还是很容易的,通过不断地删去元素,在下一轮当中跳过即可。
最初做这个题在left即剩余人数的赋值上脑残了,于是就有了Time Limited Error,于是就加上了
ios::sync_with_stdio(false);
这行代码是控制流的输入输出时间与c的输入输出时间靠近,保证程序运行的时间。
ac代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 20;
int a[maxn];
int n, k, m;
int go(int p,int d,int t)
{
while(t--)
{
do
{
p = (p + d + n - 1) % n + 1; //就是A和B在转圈圈
}
while(a[p] == 0);
}
return p;
}
int main()
{
ios::sync_with_stdio(false); //控制时间
while(cin>>n>>k>>m)
{
if(n == 0)
break;
for(int i = 1; i <= n; i++)
a[i] = i;
int left = n;
int p1 = n, p2 = 1;
while(left)
{
p1 = go(p1, 1, k);
p2 = go(p2, -1, m);
cout<<setw(3)<<p1; //控制宽度
left--;
if(p2 != p1)
{
cout<<setw(3)<<p2;
left--;
}
a[p1] = a[p2] = 0;
if(left)
cout<<",";
}
cout<<endl;
}
return 0;
}