ソート----------ダイナミックの中央値

順次整数の配列を読み取る、整数の数が読み取られたそれぞれの時間は、整数のシーケンスへの中央値の読み取りの出力奇数です。
入力フォーマット
整数入力PP、各入力データセットの行数が続くバックの代表的なデータセットの数の最初の行の。
各第1の入力データの最初の行は、データセットの整数の代表的なセット。
次に、整数MMを入力し、番号を含むデータの組を表し、MMは常に奇数、データは、スペースで区切られました。
残りのラインデータセットは、データセットから成り、各行は10のデータを含む、データ量が少ないスペースデータによって分離された最後の行10、よりてもよいです。
出力形式
データとの間のスペースとのデータの組の数と出力ビットの数を表す各データセット、最初のライン出力2つの整数(データの数の半分に添加すべきである)ため、分離しました。
データセットは、各列ごとの平均出力で構成され、残りの行は、データ量が少ないスペースデータによって分離された最後の行10、よりてもよい、10のデータを含みます。
出力には空白行があってはなりません。
データ範囲
1≤P≤10001≤P≤1000、

1≤M≤99991≤M≤9999
入力サンプル:
3
。1. 9
。1 2 6 7 8 5 4 3 9
2 9
。9 5 4 3 6 7 8 2 1
3 23は、
23 41である13であります22-324-31-11-- -7。8
。3 5103211-311-45 -67-73-81-99
-33 24 56であります

出力サンプル:
1. 5
。1 2 4 5 3
2 5
。9 8 7 6 5
3 12は
23 232222133553から3である
-7 -3

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
int main(){
 int T;
 scanf("%d", &T);
 while(T --){
  int n, m;
  scanf("%d%d", &m, &n);
  printf("%d %d\n", m, (n + 1) / 2);
    priority_queue <int> down;
  priority_queue <int, vector<int>, greater<int>> up;
    int cnt = 0;
  for (int i = 1; i <= n; i ++){
   int x;
   scanf("%d", &x);
   if (down.empty() || x <= down.top())   down.push(x);
   else       up.push(x);
   if (down.size() > up.size() + 1)  up.push(down.top()), down.pop();
   if (up.size() > down.size())      down.push(up.top()), up.pop();
   if (i % 2){
    printf("%d ", down.top());
    if (++ cnt % 10 == 0)    puts("");
   }    
  }
  if (cnt % 10)   puts("");
 }
  return 0;
}
公開された106元の記事 ウォン称賛67 ビュー5438

おすすめ

転載: blog.csdn.net/qq_45772483/article/details/104764970