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