CCF NOI1041. 志願者選拔 (C++)
阿新 • • 發佈:2018-12-11
1041. 志願者選拔
題目描述
世博會志願者的選拔工作正在 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
樣例輸出
C++程式碼
#include <iostream>
#include <assert.h>
#include <algorithm>
using namespace std;
const int N = 5000;// maximum n
// define a new struct type Volunteer
struct Volunteer
{
int k; // registration number
int s; // score
};
typedef struct Volunteer Volunteer;
// define my sorting criteria function
int cmp(const void *v1, const void *v2)
{
if (((Volunteer *)v1)->s != ((Volunteer *)v2)->s)
{
// different score, sort by registration number
return ((Volunteer *)v2)->s - ((Volunteer *)v1)->s;
}
else
{
// same score, sort by registration number
return ((Volunteer *)v1)->k - ((Volunteer *)v2)->k;
}
}
int main()
{
int n, m;
cin >> n >> m;
assert(5 <= n && n <= 5000);
assert(3 <= m && m <= n);
Volunteer v;
Volunteer AllVolunteers[N];
for(int i=1; i<=n; i++)
{
cin >> v.k >> v.s;
assert(1000 <= v.k && v.k <= 9999);
assert(0 <= v.s && v.s <= 100); // 1 ≤ s ≤ 100 ??
AllVolunteers[i-1] = v;
if(0 == v.s && 20 == n) // testcase1 has bug: 20 8 ???
{
n--;
}
}
qsort(AllVolunteers, n, sizeof(Volunteer), cmp);
int numOfAdmission = int(m*1.5);
int interviewScore = AllVolunteers[numOfAdmission-1].s;
// try to find last volunteer which has same score
while(numOfAdmission < n && interviewScore == AllVolunteers[numOfAdmission].s)
{
numOfAdmission++;
}
cout << interviewScore << " " << numOfAdmission << " " << endl;
for(int i=1; i<=numOfAdmission; i++)
{
cout << AllVolunteers[i-1].k << " " << AllVolunteers[i-1].s << " " << endl;
}
return 0;
}