題目描述
世博會志願者的選拔工作正在 A 市如火如荼的進行。為了選拔最合適的人才,A 市對
所有報名的選手進行了筆試,筆試分數達到面試分數線的選手方可進入面試。面試分數線根
據計划錄取人數的150%划定,即如果計划錄取m名志願者,則面試分數線為排名第m*150%
(向下取整)名的選手的分數,而最終進入面試的選手為筆試成績不低於面試分數線的所有
選手。
現在就請你編寫程序划定面試分數線,並輸出所有進入面試的選手的報名號和筆試成
績。
輸入輸出格式
輸入格式:
第一行,兩個整數 n,m(5 ≤ n ≤ 5000,3 ≤ m ≤ n),中間用一個空格隔開,其
中 n 表示報名參加筆試的選手總數,m 表示計划錄取的志願者人數。輸入數據保證 m*150%
向下取整后小於等於 n。
第二行到第 n+1 行,每行包括兩個整數,中間用一個空格隔開,分別是選手的報名號 k
(1000 ≤ k ≤ 9999)和該選手的筆試成績 s(1 ≤ s ≤ 100)。數據保證選手的報名號各
不相同。
輸出格式:
第一行,有兩個整數,用一個空格隔開,第一個整數表示面試分數線;第二個整數為
進入面試的選手的實際人數。
從第二行開始,每行包含兩個整數,中間用一個空格隔開,分別表示進入面試的選手
的報名號和筆試成績,按照筆試成績從高到低輸出,如果成績相同,則按報名號由小到大的
順序輸出。
輸入輸出樣例
6 3 1000 90 3239 88 2390 95 7231 84 1005 95 1001 88
88 5 1005 95 2390 95 1000 90 1001 88 3239 88
說明
【樣例說明】
m*150% = 3*150% = 4.5,向下取整后為 4。保證 4 個人進入面試的分數線為 88,但因為 88
有重分,所以所有成績大於等於 88 的選手都可以進入面試,故最終有 5 個人進入面試。
NOIP 2009 普及組 第二題
------------------------------------------------------------------------------------------------------------
思路:水。
用結構體表示每一個個體。輸入數據后快排,然后找出並加上和分數線同分的人,最后輸出。

#include<iostream> #include<algorithm> #include<cmath> using namespace std; struct point{ int x;//編號 int y;//分數 }; point k[5001]; int comp(const point &a,const point &b){ if(a.y>b.y) return 1; if(a.y<b.y) return 0; if(a.x<b.x) return 1; //成績相同時,按照編號排序 return 0; } int main(){ int n,m,i,tot,cnt=0; cin>>n; cin>>m; for(i=1;i<=n;i++){ cin>>k[i].x; cin>>k[i].y; } sort(k+1,k+1+n,comp); tot=floor(m*1.5);//向下取整 for(i=tot+1;i<=n;i++){ if(k[i].y==k[tot].y) cnt++;//找同分的情況 else break; } cout<<k[tot].y<<" "<<tot+cnt<<endl; for(i=1;i<=tot+cnt;i++){ cout<<k[i].x<<" "<<k[i].y<<endl; } return 0; }