【CSP试题回顾】201703-2-学生排队

CSP-201703-2-学生排队

解题思路

  1. 初始化队列: 初始时,学生按照学号从小到大顺序排队,即学号1的学生在最前面,学号n的学生在最后面。使用一个向量(vector)myQueue来模拟这个队列,初始填充为1, 2, …, n。

  2. 读取输入: 读取学生总数n和调整次数m。对于每一次调整,读取两个整数pq,其中p表示要调整的学生的学号,q表示移动的距离,正值代表向后移动,负值代表向前移动。

  3. 队伍操作: 对于每一次调整,遍历队列找到学号为p的学生。然后根据q的值进行操作:

    • 向后移动(q > 0): 在当前位置加上移动距离后的位置插入学号为p的学生,然后删除原来位置上的该学生。
    • 向前移动(q < 0): 在当前位置减去移动距离的位置插入学号为p的学生,然后删除原来位置上的该学生。

    在实现移动时,要特别注意数组下标与学生位置之间的关系,以及向量中元素的插入和删除操作。

完整代码

#include <iostream>
#include <vector>
using namespace std;

int n, m, p, q;

int main() {
	cin >> n >> m;

	// 初始化队列
	vector<int>myQueue(n);
	for (int i = 1; i <= myQueue.size(); i++)
	{
		myQueue[i - 1] = i;
	}

	// 队伍操作
	for (int i = 0; i < m; i++)
	{
		cin >> p >> q;
		for (int j = 0; j < myQueue.size(); j++)
		{
			if (myQueue[j] == p)  // 找到要移动的同学
			{
				if (q > 0)
				{
					myQueue.insert(myQueue.begin() + j + q + 1, p);
					myQueue.erase(myQueue.begin() + j);
				}
				else if (q < 0)
				{
					myQueue.insert(myQueue.begin() + j + q, p);
					myQueue.erase(myQueue.begin() + j + 1);
				}
				break;
			}
		}
	}

	for (auto& it : myQueue)
	{
		cout << it << " ";
	}
	return 0;
}

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值