K-很基礎的模擬題(2020年廣東工業大學第十屆文遠知行杯新生程式設計競賽)
阿新 • • 發佈:2020-12-06
給你一個長度為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; }