前提・実現したいこと
Aizu Online Judgeのアルゴリズムの問題で、与えられた数字をマージソートで昇順に並べ替えようとしています。
問題文
「n個の整数を含む数列Sを上の疑似コードに従ったマージソートで昇順に整列するプログラムを作成してください。また、mergeにおける比較回数の総数を報告してください。
入力
1行目にn、2行目にSを表すn個の整数が与えられます。
出力
1行目に整列済みの数列Sを出力してください。数列の隣り合う要素は1つの空白で区切ってください。2行目に比較回数を出力してください。」
url(https://onlinejudge.u-aizu.ac.jp/courses/lesson/1/ALDS1/5/ALDS1_5_B)
発生している問題・エラーメッセージ
要素数が少ない場合は問題なく機能するのですが、最後の500000個の数字が与えられた場合のみ以下のエラーが発生してしまいます。
timeout: the monitored command dumped core 0.14user 0.00system 0:00.34elapsed 42%CPU (0avgtext+0avgdata 5060maxresident)k 0inputs+8outputs (0major+784minor)pagefaults 0swaps
該当のソースコード
C++
1#include <bits/stdc++.h> 2#define INF 10000000 3using namespace std; 4void marge(vector<int>&S,int left, int right, int mid, int &cnt){ 5 int n1 = mid - left; 6 int n2 = right - mid; 7 vector<int> L(n1+1),R(n2+1); 8 for(int i=0;i<n1;i++)L[i]=S[left+i]; 9 for(int i=0;i<n2;i++)R[i]=S[mid+i]; 10 int i=0,j=0; 11 L[n1]=INF,R[n2]=INF; 12 for(int k=left; k<right; k++){ 13 if(L[i] <= R[j]){ 14 cnt ++ ; 15 S[k]=L[i]; 16 i++; 17 } 18 else{ 19 cnt ++ ; 20 S[k]=R[j]; 21 j++; 22 } 23 } 24} 25 26void margeSort(vector<int>&S,int left, int right, int &cnt){ 27 if(left+1<right){ 28 int mid=(left+right)/2; 29 margeSort(S,left,mid,cnt); 30 margeSort(S,mid,right,cnt); 31 marge(S,left,right,mid,cnt); 32 } 33 return; 34} 35 36int main(){ 37 int count=0,n; 38 cin >> n; 39 vector<int> S(n); 40 for(int i=0;i<n;i++)cin >> S[i]; 41 margeSort(S, 0, n, count); 42 for(int i=0;i<n;i++){ 43 if(i!=n-1)cout << S[i] << " "; 44 else cout << S[i] << endl; 45 } 46 cout << count << endl; 47}
試したこと
LRの両者のn1,n2部分に代入する数値を定義した。
補足情報(FW/ツールのバージョンなど)
当方、文系学生で、基礎的な数学の知識も持ち合わせていないので、可能であれば、答えより着眼点・原因発見のヒントやどう言うふうに考えるといいと言うようなアドバイスをいただけると今後の学習に活かせそうなのでありがたいです!!
回答1件
あなたの回答
tips
プレビュー