排队

题解 二

哈哈哈我又来写题解了,刚刚在学校OJ上AC了一道水题我就来写题解了,哈哈!是啥题目不重要,主要是我喜欢写题解

题目名字:排队
题目来源:江西理工大学OJ
题目地址:https://oj.ismdeep.com/problems/1009

废话不多说,直接上题目!

题目描述
有 n(1<=n<=100) 个人排成一队,他们的标号分别为 1,2,… ,n。 也就是说在一开始标号为1的人站在第一个位置,标号为2的人站在第二个位置,… ,标号为n的人站在最尾端也就是第n个位置。 现在有q(0<=q<=100)次操作,每次操作都会报一个号码xi(1<=xi<=n),表示让当前队伍中第xi位置的人到第一个位置上去。
比如,假设现在队列为: 3 2 4 1 5
然后在一次操作中报了3,那么第三个位置的人就会到第一个位置,于是队伍变成了4 3 2 1 5.
现在已知q次操作按顺序进行,要你输出q次操作后队伍的情况。
输入
有多组测试数据,每组测试数据的第一行输入两个整数n,q(1<=n<=100 , 0<=q<=100),分别代表队伍的总人数和操作总次数.
然后是q行,每行输入一个整数xi (1<=xi<=n),表示一次操作中所报的号码
输入数据以0 0结尾,也就是你不需要处理这组数据.
输出
每组数据输出一行,输出n个整数,表示队伍的最终状态,每个数的后面都有一个空格.

样例输入
3 2
3
2
3 2
2
3
0 0
样例输出
1 3 2
3 2 1

有一说一,这道题目确实简单。因为属于萌新的我都一遍过了
好了不扯了,进入正题。
这题目名字叫排队,其实就是考察对数组运用理解吧,讲实话这个题我不知道我的解法好不好,傻不傻,但是我个人感觉没那么麻烦(好吧这题想复杂也复杂不起来
输入输出我这边就不去讨论了,主要讲讲我的思路,首先,把需要调换位置的数取出来保存,然后将它前面的所有数全部都向后移动一位就好啦!当然了,作为一个萌新需要注意的是,如何移动?道理我们都懂:a[i+1]=a[i],但是如何去正确的实现呢?这就涉及到一个顺序问题,如果你从第一个数往后面移动,那肯定是不行的,因为你往后面移动的话,后面的数就被你覆盖了,那后面的数就没有办法向后面移动了,对不对,所以说我们要从最后开始移动,先移动被取数的前一位,然后再向前走,依次移动,直到第一位也往后面移动了,最后把被取数放在第一就可以了,所以这个题目就是注意怎么移动就好了,比较简单哈,适合新生入手!

好了,解释完了,上代码!

#include <iostream>
using namespace std;
int main()
{
    int a[10000] = {};//这个是个人习惯哈,喜欢全部先设置为0
    int n, q;
    for (;;)
    {
        cin >> n >> q;
        int m;
        if (n == 0 && q == 0)
            break;
        for (int i = 1; i <= 9999; i++)
            a[i] = i;//因为有多次嘛,所以每一次都要把数组重新来过一边
        for (int i = 1; i <= q; i++)
        {
            cin >> m;
            int b;
            b = a[m];
            for (int j = m - 1; j >= 1; j--)//记住向后移动要从后面开始
            {
                a[j + 1] = a[j];
            }
            a[1] = b;
        }
        for (int i = 1; i <= n; i++)
            cout << a[i] << " ";
        cout << endl;
    }
    return 0;//愉快的返回0结束代码
}

很适合萌新入手的一道题!

好了,又到了我发表感言的时候了,自从看了那篇博客,他们老师要求他们每道题都坚持写题解,这个习惯真的很好,可以让你对题目和题目的算法都印象深刻,而且还能给你带来美好的回忆!
嘿嘿,我今天又我的目标靠近了一点点!
我决定以后每篇题解后面都附上一句话!

“我们之所以学习,不是为了脱离贫困的家乡,而是为了让我们的家乡从此摆脱贫困!”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值