排序——分数线划定

时间:2021-04-27 22:33:57

洛谷 P1068 分数线划定
题目描述
世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才,A 市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的150%划定,即如果计划录取m名志愿者,则面试分数线为排名第m*150%(向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数线的所有选手。
现在就请你编写程序划定面试分数线,并输出所有进入面试的选手的报名号和笔试成
绩。

题目分析
巨简单的排序程序,其实在一定程度上接近模拟
首先排序(废话)
然后将m乘以1.5加一个trunc(trunc函数,取出整数部分——向下取整)
从改变后的m开始,往后搜寻重复的(即分数与其相同的),逐步增加m,防止漏掉同分者
最后输出就行啦!

type
score=record s,n:longint; end;
var
a:array[1..5000]of score;
n,m,i:longint;
procedure qs(h:longint);
var
i,j:longint;
temp:score;
begin
for i:=1 to h-1 do
for j:=i+1 to h do
if (a[i].s<a[j].s)or(a[i].s=a[j].s)and(a[i].n>a[j].n) then
begin
temp:=a[i];a[i]:=a[j];a[j]:=temp;
end;
end;

begin
readln(n,m);
m:=trunc(m*1.5);
for i:=1 to n do
readln(a[i].n,a[i].s);
qs(n);
while a[m+1].s=a[m].s do
inc(m);
writeln(a[m].s,' ',m);
for i:=1 to m do
writeln(a[i].n,' ',a[i].s);
end.