2.中文题目描述:
n 个孩子在玩一个游戏。 孩子们站成一圈,按照顺时针顺序分别被标号为 1 到 n。开始游戏时,第一个孩子成为领导。 游戏进行 k 轮。 在第 i 轮中,领导会从他顺时针方向下一个孩子开始数 ai 个孩子。最后数到的那个孩子出局,再下一个孩子成为新的领导。
举个例子, 现在圈内还剩 [8, 10, 13, 14, 16] 4个孩子,领导编号为 13 , ai = 12。那么出局的孩子为 16 。第 8 个孩子成为下一个领导。
你需要写一个代码模拟这个过程,求出每轮比赛出局的孩子。
第一行包含两个整数 n 和 k (2 ≤ n ≤ 100, 1 ≤ k ≤ n - 1).
第二行包含 k 个整数 a1, a2, ..., ak (1 ≤ ai ≤ 109).
输出 k 个整数,第 i 个整数表示第 i轮出局的孩子。
Input
7 5 10 4 11 4 1
Output
4 2 5 6 1
Input
3 2 2 5
Output
3 2
我们来看样例:
- 第一轮出局的孩子编号为 4 ,孩子 5 变成领导。
- 第二轮出局的孩子编号为 2 ,孩子 3 变成领导。
- 第三轮出局的孩子编号为 5 ,孩子 6 变成领导。
- 第四轮出局的孩子编号为 6 ,孩子 7 变成领导。
- 最后一轮出局的孩子编号为 1 ,孩子 3 变成领导。
类似于约瑟夫问题,纯粹一个模拟。貌似STL的rotate恣肆更高。
4.AC代码:
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define maxn 100100
#define N 111
#define eps 1e-6
#define pi acos(-1.0)
#define e exp(1.0)
using namespace std;
const int mod = 1e9 + 7;
typedef long long ll;
typedef unsigned long long ull;
int a[N];
bool vis[N];
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
long _begin_time = clock();
#endif
int n, k;
while (~scanf("%d%d", &n, &k))
{
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= k; i++)
scanf("%d", &a[i]);
int cur = n;
int pos = 1;
for (int i = 1; i <= k; i++)
{
int step = a[i] % cur;
int cnt = 0;
while (cnt < step)
{
while (vis[pos])
{
pos++;
if (pos > n)
pos -= n;
}
cnt++;
pos++;
if (pos > n)
pos -= n;
}
while (vis[pos])
{
pos++;
if (pos > n)
pos -= n;
}
vis[pos] = 1;
cur--;
if (i == 1)
printf("%d", pos);
else
printf(" %d", pos);
pos++;
if (pos > n)
pos -= n;
while (vis[pos])
{
pos++;
if (pos > n)
pos -= n;
}
}
puts("");
}
#ifndef ONLINE_JUDGE
long _end_time = clock();
printf("time = %ld ms.", _end_time - _begin_time);
#endif
return 0;
}