問題 B: NOIP2009普及組第2題 分數線劃定

沙雕中的沙雕雕發表於2020-11-01

題目描述

世博會志願者的選拔工作正在 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)。資料保證選手的報名號各不相同。

輸出

第一行,有兩個整數,用一個空格隔開,第一個整數表示面試分數線;第二個整數為進入面試的選手的實際人數。

從第二行開始,每行包含兩個整數,中間用一個空格隔開,分別表示進入面試的選手的報名號和筆試成績,按照筆試成績從高到低輸出,如果成績相同,則按報名號由小到大的順序輸出。

樣例輸入 Copy

6 3
1000 90
3239 88
2390 95
7231 84
1005 95
1001 88
樣例輸出 Copy

88 5
1005 95
2390 95
1000 90
1001 88
3239 88
提示

【樣例說明】

m150% = 3150% = 4.5,向下取整後為4。保證4 個人進入面試的分數線為88,但因為88有重分,所以所有成績大於等於88 的選手都可以進入面試,故最終有5 個人進入面試。

#include<bits/stdc++.h>
using namespace std;
struct biantai{
	int hm,fs;
}a[10000];
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	m=m*150/100;
	for(int i=1;i<=n;i++)
	    scanf("%d%d",&a[i].hm,&a[i].fs);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=i;j++)
			if(a[i].fs>a[j].fs)
				swap(a[i],a[j]);
			else
				if(a[i].fs==a[j].fs&&a[i].hm<a[j].hm)
					swap(a[i],a[j]);
	for(int i=1;i<=m;i++)
		if(i==m&&a[i+1].fs==a[i].fs)
			m++;
	printf("%d %d\n",a[m].fs,m);
	for(int i=1;i<=m;i++)
		printf("%d %d\n",a[i].hm,a[i].fs);		
	return 0;
}

相關文章