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; }