NPSC補完計劃

登入註冊帳號.

請輸入帳號, 密碼以及預計登入時間
進階搜尋  

最新消息:

歡迎光臨NPSC補完計劃

+ NPSC補完計劃 » NPSC國中組 » NPSC2003國中組決賽
 F 資料蒐集

作者 主題: F 資料蒐集  (閱讀 355 次)

rscpp

  • 中級會員
  • ***
  • 文章數: 60
    • 檢視個人資料
F 資料蒐集
« 於: 四月 18, 2015, 10:03:08 pm »

代碼: [選擇]
// npsc03-j2f 資料蒐集
// 第一行t,有t組資料,每組有3行 代表3個人所蒐集的資料,每一列第1個數字 n ,接著 2n個數字,代表n個選手的安打數、背號
// 3人所蒐集的選手背號皆不同,但安打數有可能相同,三人資料彙整後,依安打數由小至大列出選手背號,安打數相同依背號由小至大
#include <iostream>
#include <cstring>
#include <map>
#include <set>
using namespace std;
map<int,int> gid; //由安打數 查序號
map<int,int>::iterator mit;
set<int> glist[301]; // 最多300人,每個選手一個
set<int>::iterator sit; //
int main( )
{
   int  t,n,m,i , j , k, gcnt;
   int bn , hn; //背號、安打數
   cin >> t;
   while( t-- )
   {
gcnt=0; gid.clear();
for(i=0;i<301;++i) glist[i].clear();
for(i=0; i<3; ++i) //讀入三人的資料
{
cin >> n;  //n個選手
while(n--)
{
cin >> bn >>hn;  //背號、安打數
k = gid[hn]; //將安打數 轉成 序號 k
if(k==0) k = (++gcnt);  //若未出現過,序號+1
gid[hn]=k;
glist[k].insert(bn); //將選手背號 加入此安打數的 清單中
} // end of while(n-- n 個 選手
} //  end of for(i=0~2 , 三人的資料
// 接著依 gid安打數由小至大將有的序號找出,再依序號將選手背號印出
for(mit=gid.begin(); mit!=gid.end(); ++mit)
{
k = (mit->second);
for(sit=glist[k].begin(); sit!=glist[k].end(); ++sit)
cout << (*sit) << " ";
}
cout << endl;
}
   return 0;
}
/* 範例輸入
3
3 33 5 22 6 11 3
5 55 3 66 7 77 2 15 6 7 6
4 88 9 99 7 9 1 18 0
1 9 1
1 8 2
2 6 3 7 2
3 52 1 17 7 28 13
6 50 0 43 2 19 3 41 4 38 5 99 10
3 24 8 71 11 15 15
-------輸出
18 9 77 11 55 33 7 15 22 66 99 88
9 7 8 6
50 52 43 19 41 38 17 24 99 71 28 15
*/

記錄
+ NPSC補完計劃 » NPSC國中組 » NPSC2003國中組決賽
 F 資料蒐集