寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

Aizu Online Judge in C++ #Volume6 - 0665 : Merge

Aizu Online Judge(AOJ)の過去問から、その提出コードの解答例です。

・問題 "Merge"
https://onlinejudge.u-aizu.ac.jp/problems/0665
長さ N の正整数列 A=(A1,A2,…,AN) と,長さ M の正整数列 B=(B1,B2,…,BM) が与えられる.
これらの数列は,共に広義単調増加数列である.つまり,A1≦A2≦…≦AN, B1≦B2≦…≦BM を満たす.

以下のアルゴリズムを用いて,これらの数列から,長さ N+M の正整数列を生成する.
1. はじめ C は空とする.
2. A と B がどちらも空の場合,終了する.
3. A と B のどちらかが空の場合,そうでない数列を t とおく.どちらも空でない場合,先頭の要素が小さい数列を t とおく.ただし,A と B の先頭の要素が同じ値のときは A を t とおく.
4. t の先頭の要素を C の末尾に追加する.
5. t の先頭の要素を削除する.
6. 2. に戻る.

広義単調増加な正整数列 A, B が与えられたとき,このアルゴリズムにより生成される正整数列 C を出力するプログラムを作成せよ.

僕が作成、提出したコードは、以下のとおりです。

Aizu Online Judge in C++ #Volume6 - 0665 : Merge
/*
Aizu Online Judge in C++ #Volume6 - 0665 : Merge
https://onlinejudge.u-aizu.ac.jp/problems/0123
 提出コードの解答例
 https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
    int n,m;
    cin>>n>>m;
    vector<int> a(n),b(m);
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    for(int i=0;i<m;i++){
        cin>>b[i];
    }
    vector<int> c;
    while(1){
        if(a.empty() && b.empty()){
            break;
        }
        if(a.empty()){
            c.push_back(b[0]);
            b.erase(b.begin());
        }else if(b.empty()){
            c.push_back(a[0]);
            a.erase(a.begin());
        }else{
            if(a[0]>b[0]){
                c.push_back(b[0]);
                b.erase(b.begin());
            }else{
                c.push_back(a[0]);
                a.erase(a.begin());
            }
        }
    }
    for(int i=0;i<c.size();i++){
        cout<<c[i]<<endl;
    }
    return 0;
}

設問の出典は、プログラミング問題のオンライン採点システム「Aizu Online Judge(AOJ)」です。
http://judge.u-aizu.ac.jp/onlinejudge/