K-很基础的模拟题(2020年广东工业大学第十届文远知行杯新生程序设计竞赛)

给你一个长度为n的数组,现在定义以下三种操作。

"1 x"表示删除数组的第x(1<=x<=m)个元素,第x+1到第m个元素全部往前移一位。m为操作前数组的元素个数。
"2 x y"表示在数组的第x(1<=x<=m)位插入元素y,原数组的第x个元素到第m个元素全部往后移一位。m为操作前数组的元素个数。

"3 x"表示从数组第x(1<=x<=m)个元素开始与 第x位元素的值相等且连续的一整段数合并到数组的第x位,剩余元素依次前移。m为操作前数组的元素个数。

输入描述:

第一行读入一个n和q(1<=n<=100,1<=q<=100),分别表示初始数组的长度和操作次数。

第二行读入n个整数,表示初始数组的元素。每个元素的大小不超过100。

第三行到第q+2行,每行按格式读入一种操作。

输出描述:

对于每次操作,输出完成操作后的数组。

输入

8 3
1 2 2 2 3 5 4 2
1 5
2 4 2
3 3

输出

1 2 2 2 5 4 2
1 2 2 2 2 5 4 2
1 2 6 5 4 2
解析
确实是一道简单的模拟题,直接暴力就行,数据范围很小,但是要注意每执行完一次询问之后n的值需要改变
AC代码
#include<iostream>
using namespace std;
int main()
{
    long long a[110]={0};
    int n,q;
    scanf("%d%d",&n,&q);
    for(int i=0;i<n;i++) scanf("%lld",&a[i]);
    while(q--)
    {
        int x;
        scanf("%d",&x);
        if(x==1)
        {
            int y;
            scanf("%d",&y);
            for(int i=y-1;i<n-1;i++) a[i]=a[i+1];
            for(int i=0;i<n-1;i++) printf("%lld ",a[i]);
            printf("\n");
            n=n-1;
        }
        else if(x==2)
        {
            int y;
            long long z;
            scanf("%d%lld",&y,&z);
            for(int i=n;i>y-1;i--) a[i]=a[i-1];
            a[y-1]=z;
            for(int i=0;i<=n;i++) printf("%lld ",a[i]);
            printf("\n");
            n=n+1;
        }
        else
        {
            long long y,num=0;
            scanf("%lld",&y);
            for(int i=y;i<n;i++)
            {
                if(a[i]==a[i-1]) num++;
                else break;
            }
            a[y-1]=a[y-1]*(num+1);
            for(int i=y,j=y+num;j<n;i++,j++)
            {
                a[i]=a[j];
            }
            for(int i=0;i<n-num;i++) printf("%lld ",a[i]);
            printf("\n");
            n=n-num;
        }
    }
    return 0;
}

 



posted @ 2020-12-06 19:51  TheWeak  阅读(58)  评论(0编辑  收藏  举报