題目:
題目描述
世博會志願者的選拔工作正在 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 普及組 第二題
題解:注意;;樣例中,m*1.5=4,但是排序後第五個人分數與第四名相同爲88,所以實際進入的人是五人
代碼:
#include<iostream>
#include<cstring>
#include<string.h>
#include<algorithm>
using namespace std;
struct ss{
int sno;
int grade;
}a[6000];
bool cmp(ss A,ss B)
{
if(A.grade==B.grade)
return A.sno<B.sno;
else
return A.grade>B.grade;
}
int main()
{
int n,m;
cin>>n>>m;
m=m*1.5;
for(int i=0;i<n;i++)
cin>>a[i].sno>>a[i].grade;
sort(a,a+n,cmp);
//cout<<a[m-1].grade<<" "<<m<<endl;
int x=m;
for(int i=m;i<n;i++)
{
if(a[i].grade>=a[m-1].grade)
x++;
}
cout<<a[x-1].grade<<" "<<x<<endl;
for(int i=0;i<x;i++)
{
cout<<a[i].sno<<" "<<a[i].grade<<endl;
}
return 0;
}