题目
一共有n个参加笔试的人,面试分数线根据计划录取人数的150%划定,即如果计划录取m名志愿者,则面试分数线为排名第m*150%(向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数线的所有选手。
要求划定面试分数线,并输出所有进入面试的选手的报名号和笔试成绩。(按照笔试成绩从高到低输出,如果成绩相同,则按报名号由小到大的顺序输出。)
题解
多关键字排序,笔试分数为第一关键字,报名号为第二关键字。然后按要求找出分数线(向下取整trunc),先输出分数线和录取人数,再输出报名号和笔试成绩。
时间复杂度O(n log n)
代码
var
n,m,i:longint;
a,b:array[1..5000]of longint;
procedure qsort(l,r:longint);
var
i,j,key,key2,t:longint;
begin
if l>=r then exit;
i:=l;j:=r;
key:=a[(l+r)div 2];
key2:=b[(l+r)div 2];
repeat
while ((a[i]>key)or((a[i]=key)and(b[i]<key2))) and(i<r) do inc(i);
while ((a[j]<key)or((a[j]=key)and(b[j]>key2)))and(j>l) do dec(j);
if i<=j then
begin
t:=a[i];
a[i]:=a[j];
a[j]:=t;
t:=b[i];
b[i]:=b[j];
b[j]:=t;
inc(i);dec(j);
end;
until i>j;
qsort(i,r);
qsort(l,j);
end;
begin
readln(n,m);
for i:=1 to n do
read(b[i],a[i]);
qsort(1,n);
m:=trunc(m*1.5);
while a[m]=a[m+1] do inc(m);
writeln(a[m],' ',m);
for i:=1 to m do
writeln(b[i],' ',a[i]);
end.