天天看點

【UPCOJ】問題 A: 小明愛數列

目錄

    • 題目描述
    • 輸入格式
    • 輸出格式
    • 樣例輸入
    • 樣例輸出

題目描述

小明非常喜歡數列,于是他提出了一個關于數列的問題。他拿到一個長度為n的數列,之後對這個數列進行了兩種操作:

第一種:D x。表示删除數列第x位置的一個數字,後面的數字向前移動(若x>此時數列長度則操作無效);

第二種:Z x y。表示在數列的第x位置插入一個數字y,後面的數字向後移動(若x>此時數列長度則在數列末尾插入y);

經過k次這兩種操作以後,小明想要知道現在的數列是什麼,聰明的你可以幫助小明解決這個問題嗎?

輸入格式

輸入包括k+2行資料;

第一行包括兩個數n,k,分别表示數列中數的個數以及操作的次數,其中1≤k≤n<5000;

第二行n個數表示該數列的n個數,以空格隔開,其中任意數ai為int範圍内的整數;

第三行到第k+2行,每行一個操作,格式見題面描述。

輸出格式

輸出包括兩行;

第一行一個數m,表示全部操作之後數組的長度;

第二行m個數,表示目前的數組。

樣例輸入

4 3
4 5 2 1
Z 3 3
Z 0 1
D 2
           

樣例輸出

5
1 4 2 3 1
           

标簽:vector的insert()、erase()、push_back()、size()、疊代器

注意:

如果插入時或删除時沒有檢查v.size()會報運作錯誤

AC代碼:

#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
int main(){
    char c;
    int a,n,k;
    int q,m;
    vector<int> v;
    cin>>n>>k;
    for(int i=0;i<n;i++){
        cin>>a;
        v.push_back(a);
    }
    for(int i=0;i<k;i++){
        cin>>c;
        if(c=='Z'){
            cin>>q>>m;
            if(q>v.size()){
            	v.push_back(m);
            	continue;
            }
            v.insert(v.begin()+q,m);
        }
        else{
            cin>>q;
            if(q>=v.size())
            	continue;
            v.erase(v.begin()+q);
        }
    }
    cout<<v.size()<<endl;
    for(vector<int>::iterator it=v.begin();it!=v.end();it++)
        cout<<*it<<' ';
    return 0;
}
           

繼續閱讀