问题描述:

试题编号: 201703-2
试题名称: 学生排队
时间限制: 1.0s
内存限制: 256.0MB
问题描述:

问题描述

  体育老师小明要将自己班上的学生按顺序排队。他首先让学生按学号从小到大的顺序排成一排,学号小的排在前面,然后进行多次调整。一次调整小明可能让一位同学出队,向前或者向后移动一段距离后再插入队列。
  例如,下面给出了一组移动的例子,例子中学生的人数为8人。
  0)初始队列中学生的学号依次为1, 2, 3, 4, 5, 6, 7, 8;
  1)第一次调整,命令为“3号同学向后移动2”,表示3号同学出队,向后移动2名同学的距离,再插入到队列中,新队列中学生的学号依次为1, 2, 4, 5, 3, 6, 7, 8;
  2)第二次调整,命令为“8号同学向前移动3”,表示8号同学出队,向前移动3名同学的距离,再插入到队列中,新队列中学生的学号依次为1, 2, 4, 5, 8, 3, 6, 7;
  3)第三次调整,命令为“3号同学向前移动2”,表示3号同学出队,向前移动2名同学的距离,再插入到队列中,新队列中学生的学号依次为1, 2, 4, 3, 5, 8, 6, 7。
  小明记录了所有调整的过程,请问,最终从前向后所有学生的学号依次是多少?
  请特别注意,上述移动过程中所涉及的号码指的是学号,而不是在队伍中的位置。在向后移动时,移动的距离不超过对应同学后面的人数,如果向后移动的距离正好等于对应同学后面的人数则该同学会移动到队列的最后面。在向前移动时,移动的距离不超过对应同学前面的人数,如果向前移动的距离正好等于对应同学前面的人数则该同学会移动到队列的最前面。

输入格式

  输入的第一行包含一个整数n,表示学生的数量,学生的学号由1到n编号。
  第二行包含一个整数m,表示调整的次数。
  接下来m行,每行两个整数p, q,如果q为正,表示学号为p的同学向后移动q,如果q为负,表示学号为p的同学向前移动-q。

输出格式

  输出一行,包含n个整数,相邻两个整数之间由一个空格分隔,表示最终从前向后所有学生的学号。

样例输入

8
3
3 2
8 -3
3 -2

样例输出

1 2 4 3 5 8 6 7

评测用例规模与约定

  对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ m ≤ 1000,所有移动均合法。

解题思路:

这是一个模拟题,关键在于数据表示。

方法一:使用STL的向量vector来实现。实际上是一种代码最为简洁的做法。

需要注意的是下标运算逻辑。

方法二:数组sno2pos[]用于存储各个学生(学号)所在的位置;

数组pos2sno[]是索引,pos2sno[i]=s表示学生s位于位置i。

这个程序应该是最快速的版本。

解题代码:(方法一)

#include <iostream>
#include <vector>
using namespace std;
vector<int> v;
int find(int x){int ret = - 1;for(int i = 0; i < (int)v.size(); i++)if(v[i] == x)return i;return ret;
}
int main(){int n, m, p, q;// 读入数据cin >> n >> m;// 初始化for(int i=1; i<=n; i++)v.push_back(i);// 模拟移动过程for(int i=1; i<=m; i++) {cin >> p >> q;int pos = find(p);v.insert(v.begin() + pos + (q > 0 ? q + 1 : q), p);v.erase(v.begin() + pos + (q < 0 ? 1 : 0));}// 输出结果cout << v[0];for(int i = 1; i < (int)v.size(); i++)cout << " " << v[i];cout << endl;return 0;
}

解题代码:(方法二)

#include <iostream>
using namespace std;
const int N = 1000;
int sno2pos[N+1];   // 学号所在位置
int pos2sno[N+1];   // 位置上的学号
int main(){int n, m, p, q;cin >> n >> m;for(int i=1; i<=n; i++) {sno2pos[i] = i;pos2sno[i] = i;}for(int i=1; i<=m; i++) {int pos1, pos2, sno2;cin >> p >> q;if(q != 0) {int move, end;if(q > 0) {move = 1;end = q;} else {move = -1;end = -q;}pos1 = sno2pos[p];for(int i=1; i<=end; i++) {sno2 = pos2sno[pos1 + move];pos2 = sno2pos[sno2];pos2sno[pos1] = sno2;sno2pos[sno2] = pos1;pos1 = pos2;}pos2sno[pos2] = p;sno2pos[p] += q;}}cout << pos2sno[1];for(int i=2; i<=n; i++)cout << " " << pos2sno[i];cout << endl;return 0;
}

CCF201703-2 学生排队相关推荐

  1. CCF201703-2 学生排队(100分)

    试题编号: 201703-2 试题名称: 学生排队 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 体育老师小明要将自己班上的学生按顺序排队.他首先让学生按学号从小到大的顺序排 ...

  2. CCF-CSP 201703-2 试题名称: 学生排队(满分代码)

    问题描述 试题编号: 201703-2 试题名称: 学生排队 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 体育老师小明要将自己班上的学生按顺序排队.他首先让学生按学号从小到 ...

  3. CCF 201703-2 学生排队

    试题编号: 201703-2 试题名称: 学生排队 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 体育老师小明要将自己班上的学生按顺序排队.他首先让学生按学号从小到大的顺序排 ...

  4. java利用队列实现一个学生排队买票功能

    1.利用队列实现一个学生排队买票功能 1.定义一个学生类Student,包括学号No.姓名Name.性别Gender.年龄Age等信息 2.定义一个队列类Queue,用于将学生进行队列排序 3.可以从 ...

  5. 201703-2学生排队

    问题描述 体育老师小明要将自己班上的学生按顺序排队.他首先让学生按学号从小到大的顺序排成一排,学号小的排在前面,然后进行多次调整.一次调整小明可能让一位同学出队,向前或者向后移动一段距离后再插入队列. ...

  6. ccf-csp #201703-2 学生排队

    题目链接:http://118.190.20.162/view.page?gpid=T56 题目分析 一开始看到题目描述以为是一道有点意思的算法题,看完数据范围1 ≤ n ≤ 1000,1 ≤ m ≤ ...

  7. CSP认证201703-2 学生排队[C++题解]:模拟

    文章目录 题目解答 题目链接 题目解答 来源:acwing 分析:模拟,按照题目要求暴力来做,时间复杂度O(mn)O(mn)O(mn) AC代码 #include<bits/stdc++.h&g ...

  8. CCF 2017-3-2 学生排队

    样例输入 8 3 3 2 8 -3 3 -2 样例输出 1 2 4 3 5 8 6 7 思路:移动过程中,涉及到元素在中间位置的插入和删除,list容器是最佳选择:先遍历整个链表找到要移动的元素的位置 ...

  9. 201703-2-学生排队

    试题编号: 201703-2 试题名称: 学生排队 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 体育老师小明要将自己班上的学生按顺序排队.他首先让学生按学号从小到大的顺序排 ...

最新文章

  1. HTML5 geolocation和BaiduMap、BingMap、GoogleMap
  2. jackson (json、xml的序列化与反序列化)
  3. 【Android 异步操作】Handler 机制 ( Android 提供的 Handler 源码解析 | Handler 构造与消息分发 | MessageQueue 消息队列相关方法 )
  4. 斗鱼实名认证 mysql_斗鱼扩展--DouyuRoom使用说明(十四)
  5. python代码颜色不同_Python填充任意颜色,不同算法时间差异分析说明
  6. java根据pdf模板生成pdf_Java 复制、压缩PDF文档
  7. 登录id 黑苹果_黑苹果MacOSCatalina无法登录AppStore修复
  8. windows 获取系统CPU和进程CPU 内存等信息
  9. STM32中断应用总结
  10. Python collection模块与深浅拷贝
  11. java怎么释放分配的内存,linux 内存的分配和释放,linux分配释放
  12. 解决360 安装补丁智能忽略的问题!
  13. Java POI 合并单元格操作以及代码示例
  14. (27)语义分割--cityscape数据集的读取和使用
  15. 信息搜集之CDN知识
  16. QQ群创建者和管理员
  17. 苹果充电器怎么辨别真假_airpods怎么辨别真假?
  18. Halcon入门(3)——回形针目标提取
  19. 在stm32cubemx的freertos中创总任务跑支线任务
  20. 大数据发展前沿 期末总结复习

热门文章

  1. Thinkpad T61/R61/X61安装XP驱动流程
  2. rocketmq支持最大消息_分布式消息引擎Apache RocketMQ最佳实践
  3. 开源 协作工具_使用HackMD在开源项目上进行协作
  4. 不同管理岗层级的团队影响力_高影响力团队的最高要求
  5. red hat 5.3补丁_您如何解释组织的宗旨? 来自Red Hat的3课
  6. git查看提交者提交历史_如何维护您的提交者
  7. java 保存和读取本地文件
  8. 用一个案例介绍jQuery插件的使用和写法
  9. 厉害了 | 一秒切换Hexo中英文,厉害了!!
  10. 必知必会 | 关于Redis缓存这三大问题,必知必会