1. 程式人生 > >CCF NOI1041. 志願者選拔 (C++)

CCF NOI1041. 志願者選拔 (C++)

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; }