★实验任务
饱了吗终于发现泡泡破解了它的代码并借此白吃白喝。饱了吗当即改变了自 己的幸运儿生成源码,但是,又被机智的泡泡偷瞄到了,机智的泡泡马上意识到 可能要饭碗不保了:
每当有人参与抽奖,这个人就进入队列。当人数达到 n 的时候开奖一次。 1. 开奖时,将执行 m 次操作,每次操作挑一个不超过 200 的数 d,且保证 d 不超过人数的一半,然后把第 D 个人和第 n-D+1 个人这两个人之间的队伍反转:
2. 反转前:1,2,...,D-1,D,D+1,..., n-D+1, n-D+2,...n(从左往右编号)
3. 反转后:1,2,...,D-1,n-D+1,n-D,..., D+1, D, n-D+2...n(这里的编号 是旋转前从左到右的编号) m 次操作完后从队头开始报号,没报到 x 的回到队尾,报到 x 的就是幸运儿 啦;
机智的泡泡马上又意识到,当 n 和 m 次操作和 x 的值已知的时候,幸运儿仍 然是可以预知到是第几个参与抽奖的人的。 机智的泡泡马上又意识到,自己的饭碗保住了。 但是!机智的泡泡马上意识到一个问题,这个预知结果的代码不好打。 但是!机智的泡泡马上想起了你。 机智的泡泡马上把锅又扔给了你。
★数据输入
输入第一行为三个正整数 n,m,x。 接下来 m 行,第 i 行给出第 i 次操作的 d,如题; 对于 80%的数据,2<=n<=2000,1<=m<=2000; 对于 100%的数据,2<=n<=100000,1<=m<=100000 1<=x<=1000,000,000,1<=d<=min(n/2,200);
★数据输出
输出幸运儿是第几个参加抽奖的人。
输入示例 | 输出示例 |
---|---|
5 2 1 2 1 |
5 |
输入示例 | 输出示例 |
---|---|
5 4 3 2 1 2 1 |
3 |
★思路
判断所求位置是否被反传(不要每次操作都去实现),奇数次反转相当于反转一次,偶数次反转相当于没有被反转。
坑点就是报数到x,x可能大于数组长度。
于是有了这段代码
temp = x%n;
if (temp == 0)
temp = n;
★Code
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
int m, n, x, i, d, flag = 0;
int temp;
cin >> n >> m >> x;
temp = x%n;
if (temp == 0)
temp = n;
for (i = 0; i < m; i++)
{
cin >> d;
if ((temp>=d)&&(temp<=n+1-d))
flag++;
}
if (flag % 2 == 0)
cout << temp<<endl;
else
cout << n - temp + 1<<endl;
return 0;
}