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 31 2 2 2 3 5 4 21 52 4 23 3
输出1 2 2 2 5 4 21 2 2 2 2 5 4 21 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;
} 
京公网安备 11010502036488号