算法与数据结构实验题 2.3 泡泡的饭碗

★实验任务

饱了吗终于发现泡泡破解了它的代码并借此白吃白喝。饱了吗当即改变了自 己的幸运儿生成源码,但是,又被机智的泡泡偷瞄到了,机智的泡泡马上意识到 可能要饭碗不保了:

每当有人参与抽奖,这个人就进入队列。当人数达到 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;
}

        
        
原文地址:https://www.cnblogs.com/031602523liu/p/7676201.html