K-很基础的模拟题

原题传送门

题目描述

给你一个长度为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行,每行按格式读入一种操作。
输出描述:
对于每次操作,输出完成操作后的数组。
示例1*
输入:
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;
const int N = 120;
int arr[N];
int n;

void del(int a){ //操作1
    for(int i = a; i < n - 1; i++){ 
        arr[i] = arr[i + 1];//将数组元素从第a位开始,依次往前移
    }
    n--;//记得减一
}

void insert(int x, int y){ //操作2
    n++;
    for(int i = n - 1;i >= x; i--){
        arr[i] = arr[i - 1];//将第x个位置之后的元素往后移,
                            //为插入的元素挪出一个位置
    }
    arr[x] = y; //在第x位上插入y
}

void merge(int x){ //操作3 
    int count = 0;
    for(int i = x; i < n; i++){
        if(arr[x] == arr[i])
            count++;//计算重复的元素有多少个
        else
            break;//遇到不相同的元素跳出循环
    }
    arr[x] = arr[x] * count;//合并值到第x位
    for(int i = x + count; i < n; i++){
        arr[++x] = arr[i];//将剩下的元素往前挪动
    }
    n -= count - 1;//记得改变n的值
}

void output(void){ //输出操作后的结果
    for(int i = 0; i < n; i++) cout << arr[i] << ' ';
    cout << endl;
}

int main(){
    int t;
    cin >> n >> t;
    for(int i = 0; i < n; i++) cin >> arr[i];
    while(t--){
        int a;
        cin >> a;
        if(a == 1){
            int x;
            cin >> x;
            del(x - 1);
            output();
        }
        else if(a == 2){
            int x, y;
            cin >> x >> y;
            insert(x - 1, y);
            output();
        }
        else if(a == 3){
            int x;
            cin >> x;
            merge(x - 1);
            output();
        }
    }

    return 0;
}

如有写的不妥,希望大佬能指正