3-09. キュー内の要素のソート【pat】
3-09. キュー内の要素のソート
時間の制限
50 ms
メモリ制限
32000 kB
コード長制限
8000 B
クイズルーチン
Standard
キューを指定するには、次のような合法的なキュー操作関数を使用します.
(1) int IsEmptyQ(Queue Q) (2) void AddQ(Queue Q, ElementType item) (3) ElementType DeleteQ(Queue Q)
キュー内の要素を小さいものから大きいものに並べ替えます.
注意:キュー(配列)の要素に直接アクセスするには、配列の下に表示されません.補助キューを使用します.ソート後の結果は元のキューに保存します.
フォーマットの説明を入力:
入力は、まず1つの正の整数N(<=105)を与え、キュー内の要素の個数を表す.その後、N個の整数がエンキューの順序で与えられる(ここではitemが整数値であると仮定する).
出力フォーマットの説明:
ソート後にデキューされたシーケンスを1行に出力します.数字の間はスペースで区切られていますが、末尾に余分なスペースを入れてはいけません.
サンプルの入力と出力:
シーケンス番号
入力
しゅつりょく
1
【結題報告】:この問題は面白いですね.一見普通の並べ替え問題だと思います.条件をよく見ると、2つのキューとその合法的な操作しかできず、下付き文字にアクセスできません.出題者の意図は、あなたが並べ替えアルゴリズムをシミュレートする過程を考えることです.並べ替えアルゴリズムは数種類あります.複雑度O(N^2)のはきっとだめで、問題の設定時間は50 msしかありません.残りは集計ソートかクイックソートかもしれません.条件制限は下付き文字にアクセスできません.セカンダリスペースにもキューが1つしかありません.quick sortはだめだと思います.すぐにデータを交換しなければならないので、チェーンテーブルがデータを巡るときは不便です.では、merge sortの方向に考えてみましょう.mergeの考え方は簡単にグループに分けて、グループ内でソートしてからグループ間でソートします.3つのキューが必要です.2つを統合して3番目に入れます.しかし、タイトル自体は2つのキューしかないので、結果はどこに置きますか.答えは:元のキューの末尾!ここまで考えてみればわかる.
デバッグするときは(1)(1 m)(n 1)のような場合に注意しましょう.
時間の制限
50 ms
メモリ制限
32000 kB
コード長制限
8000 B
クイズルーチン
Standard
キューを指定するには、次のような合法的なキュー操作関数を使用します.
(1) int IsEmptyQ(Queue Q) (2) void AddQ(Queue Q, ElementType item) (3) ElementType DeleteQ(Queue Q)
キュー内の要素を小さいものから大きいものに並べ替えます.
注意:キュー(配列)の要素に直接アクセスするには、配列の下に表示されません.補助キューを使用します.ソート後の結果は元のキューに保存します.
フォーマットの説明を入力:
入力は、まず1つの正の整数N(<=105)を与え、キュー内の要素の個数を表す.その後、N個の整数がエンキューの順序で与えられる(ここではitemが整数値であると仮定する).
出力フォーマットの説明:
ソート後にデキューされたシーケンスを1行に出力します.数字の間はスペースで区切られていますが、末尾に余分なスペースを入れてはいけません.
サンプルの入力と出力:
シーケンス番号
入力
しゅつりょく
1
10 9 4 6 1 8 3 7 0 2 5
0 1 2 3 4 5 6 7 8 9
【結題報告】:この問題は面白いですね.一見普通の並べ替え問題だと思います.条件をよく見ると、2つのキューとその合法的な操作しかできず、下付き文字にアクセスできません.出題者の意図は、あなたが並べ替えアルゴリズムをシミュレートする過程を考えることです.並べ替えアルゴリズムは数種類あります.複雑度O(N^2)のはきっとだめで、問題の設定時間は50 msしかありません.残りは集計ソートかクイックソートかもしれません.条件制限は下付き文字にアクセスできません.セカンダリスペースにもキューが1つしかありません.quick sortはだめだと思います.すぐにデータを交換しなければならないので、チェーンテーブルがデータを巡るときは不便です.では、merge sortの方向に考えてみましょう.mergeの考え方は簡単にグループに分けて、グループ内でソートしてからグループ間でソートします.3つのキューが必要です.2つを統合して3番目に入れます.しかし、タイトル自体は2つのキューしかないので、結果はどこに置きますか.答えは:元のキューの末尾!ここまで考えてみればわかる.
#include
#include
#include
#include
using namespace std;
deque que1;
deque que2;
void print_q(deque que)
{
bool first=true;
while(!que.empty())
{
if(!first)
printf(" %d",que.front());
else
printf("%d",que.front());
first=false;
que.pop_front();
}
}
void merge_sort(int n,int m,deque& que,deque& que2)
{
int i=0,j=0;
i=0;
j=0;
while(i&que_out,deque& que_in)
{
int i=0;
for(i=0;i& que,deque& que2)
{
int i=0;
if(n!=1)
merge_div(n/2,n-n/2,que,que2);
if(m!=1)
merge_div(m/2,m-m/2,que,que2);
if((n==1&&m==1))
{
que2.push_back(que.front());
que.pop_front();
merge_sort(n,m,que,que2);
}
else//if m n doesn't equal 1 they should be combine with other nums
{
if(n==1)
{
que_pop(m,que,que2);
merge_sort(m,n,que,que2);
}
else if(m==1)
{
que_pop(n,que,que2);
merge_sort(n,m,que,que2);
}
else
{
que_pop(m,que,que2);
que_pop(n,que,que);
merge_sort(m,n,que,que2);
}
}
}
int main()
{
int n=0,i=0;
int temp=0;
while(scanf("%d",&n)!=EOF)
{
////////
// n=100;
//int time_s=time(NULL);
for(i=0;i
デバッグするときは(1)(1 m)(n 1)のような場合に注意しましょう.