CCF - 201703-2 - 学生排队

问题描述

试题编号:    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,所有移动均合法。

思路

模拟题,关键在于数据表示

代码

#include<stdio.h>
int main()
{
    int i,n,m,p,q,move,goal,posp,nummove,num[1001],pos[1001];
    scanf("%d %d",&n,&m);
    for(i=1;i<=n;i++)
    {
        num[i]=i;//i位置的学生
        pos[i]=i;//i学生的位置
    }
    while(m--)
    {
        scanf("%d %d",&p,&q);
        move=q>0?1:-1;
        goal=q>0?q:-q;
        posp=pos[p];
        for(i=1;i<=goal;i++)
        {
            nummove=num[posp+move];
            num[posp]=nummove;
            pos[nummove]=posp;
            posp=posp+move;
        }
        pos[p]=posp;
        num[posp]=p;
    }
    for(i=1;i<=n;i++)
        printf("%d ",num[i]);
    printf("\n");
    return 0;
}
时间: 2024-10-26 20:11:15

CCF - 201703-2 - 学生排队的相关文章

CCF——学生排队(2017-3)

问题描述 体育老师小明要将自己班上的学生按顺序排队.他首先让学生按学号从小到大的顺序排成一排,学号小的排在前面,然后进行多次调整.一次调整小明可能让一位同学出队,向前或者向后移动一段距离后再插入队列. 例如,下面给出了一组移动的例子,例子中学生的人数为8人. 0)初始队列中学生的学号依次为1, 2, 3, 4, 5, 6, 7, 8: 1)第一次调整,命令为"3号同学向后移动2",表示3号同学出队,向后移动2名同学的距离,再插入到队列中,新队列中学生的学号依次为1, 2, 4, 5,

[CCF 201703-2 学生排队] VS2019使用erase时的问题

#include <iostream> #include <vector>#inclde <algorithm> using namespace std; int main() { int n, t; vector<int> que; cin >> n >> t; for (int i = 0; i < n; i++) { que.push_back(i+1); } for (int i = 0; i < t; i++)

CCF学生排队

这题如果考虑考虑用数组折腾会非常麻烦,如果想到用vector的insert函数和erase函数就会非常舒服的模拟出来.vt.erase(it)之后it就变成了野指针,所以要用it=erase(it),这样it就会自动指向下一个元素. #include<cstdio> #include<iostream> #include<vector> #include<algorithm> #include<string.h> using namespace

CCF 20170302 学生排队

#include<iostream> #include<vector> #include<algorithm> using namespace std; const int N = 1000; vector<int> v(N); int main(){ int n, m; cin>>n>>m; for(int i = 0; i < n; i++){ v[i] = i + 1; } int p,q; for(int i = 0;

CCF签到汇总(JAVA版本,2013-12~2018-12)

CCF签到题,没有提到分数的题目都是100分,不然会额外提出,样例输入都单独文本复制粘贴了,这样你们测试的时候很方便粘贴用例,不用自己手敲,都是一些签到题.但有好的基础,会多的数据结构,好的数学思想,那么这些都是一些很简单的问题.因为java版本不多,所以仅供参考,以下代码的思路都很简单,很多都直接通过题目面向过程,有更好的想法,或者你我有些题没有满分的改进方式都可以交流. CCF300分的线,1.2题需要拿满,最低也要190,第三题是理解题,很多时候考你的语文能力更多,第四题是规律性更强的题,

Codeforces Round #247 (Div. 2) ABC

Codeforces Round #247 (Div. 2) http://codeforces.com/contest/431 代码均已投放:https://github.com/illuz/WayToACM/tree/master/CodeForces/431 A - Black Square 题目地址 题意: Jury玩别踩白块,游戏中有四个区域,Jury点每个区域要消耗ai的卡路里,给出踩白块的序列,问要消耗多少卡路里. 分析: 模拟水题.. 代码: /* * Author: illuz

栈和队列的总结

栈和队列的总结: (有时候感觉自己掌握了,栈和队列,可是在写的时候会遇到不同的情况,就不会处理了,因此在这里进行总结下). 栈: 栈是一端受限,一段允许进行操作的线性表.我自己理解时,会将它理解成一个装书的盒子.放书,取书,就是进行的操作.这个的特点就是,你放了一踏书,现在你想取书,你只能先把上面的书一个个取出来,即:先放的后取,后放的先取.放在栈上说,就是先进后出. 明白了栈的定义,现在要实际的实际,首先是它的逻辑结构:线性表.它是线性的. 现在是它的存储结构:最常采用的是顺序存储和链式存储(

从通讯聊计算机

导问 给你导线若干,以及一个小灯泡,你能否让计算机将其点亮? 通讯中如何保障数据的位的丢失? (本文技术主要还是几年前做的,细节之处所记之处可能不甚准确) 文 对于接口, 不同系统不同平台有不同接口,不同的虚拟方式,我们先以RS232举例,由于硬件参数相同,无论Linux还是Windows这块是一致的. 对于RS232程序者来说,往往只关心数据,因此往往只关注2,3口.(其实有的做硬件也他么的只接了235,具体定义可以去查寻MSDN文档或者RS232定义) 众所周知这个参数非常显眼——频率,为什

递推(二):递推法的应用

下面通过一些典型实例及其扩展来讨论递推法的应用. [例2]骨牌铺方格 在2×n的一个长方形方格中,用一种2×1的骨牌铺满方格.输入n(n<=40),输出铺放方案的总数. 例如n=3时,为2×3方格,骨牌的铺放方案有三种,如下图1所示. 图1  2×3方格的骨牌铺放方案 (1)编程思路. 设f[i]为铺满2*n方格的方案数,则有    f[i]=f[i-1]+f[i-2]. 其中,f[i-1]为铺满2*(n-1)方格的方案数(既然前面的2*(n-1)的方格已经铺满,那么最后一个只能是竖着放).f[