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/