CF - 792B. Counting-out Rhyme - 模拟

2.中文题目描述:

n 个孩子在玩一个游戏。 孩子们站成一圈,按照顺时针顺序分别被标号为 1 到 n。开始游戏时,第一个孩子成为领导。 游戏进行 k 轮。 在第 i 轮中,领导会从他顺时针方向下一个孩子开始数 ai 个孩子。最后数到的那个孩子出局,再下一个孩子成为新的领导。

举个例子, 现在圈内还剩 [8, 10, 13, 14, 16] 4个孩子,领导编号为 13 , ai = 12。那么出局的孩子为 16 。第 8 个孩子成为下一个领导。

你需要写一个代码模拟这个过程,求出每轮比赛出局的孩子。

Input

第一行包含两个整数 n 和 k (2 ≤ n ≤ 1001 ≤ k ≤ n - 1).

第二行包含 k 个整数 a1, a2, ..., ak (1 ≤ ai ≤ 109).

Output

输出 k 个整数,第 i 个整数表示第 i轮出局的孩子。

Example
Input
7 5
10 4 11 4 1
Output
4 2 5 6 1 
Input
3 2
2 5
Output
3 2 
Note

我们来看样例:

  • 第一轮出局的孩子编号为 4 ,孩子 5 变成领导。
  • 第二轮出局的孩子编号为 2 ,孩子 3 变成领导。
  • 第三轮出局的孩子编号为 5 ,孩子 6 变成领导。
  • 第四轮出局的孩子编号为 6 ,孩子 7 变成领导。
  • 最后一轮出局的孩子编号为 1 ,孩子 3 变成领导。
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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值