2014noip复赛模拟练习5(答案)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
小白的名次
题目描述
兔子小白是位数学爱好者,有一次它参加了兔界里的数学比赛,成绩公布后,小白很想知道自己的成绩到底排第几,现在请你帮它编一个程序,要求输入一个成绩,就能知道相应的名次。注意:同分的按相同名次算,且只算一次。
输入
输入共三行。
第一行:一个整数n(n<=30000)
第二行:n个正整数(这些数不大于1000)。
第三行:一个整数,需要查询的分数。
输出
输出共一行。一个整数,查询成绩的名次。
样例输入
7
30 50 80 60 20 50 60
50
样例输出
3
var a:array[0..1000] of integer;
i,n ,x,y,s,max:integer;
begin
readln(n);
for i:=1 to 1000 do a[i]:=-1;
max:=0;
for i:=1 to n do
begin
read(x);
if x>max then max:=x;
a[x]:=1;
end;
read(y);
i:=max;
while (a[i]<>y) and (i>y) do
begin dec(i); if a[i]=1 then inc(s); end;
writeln(s+1);
end.
小s同学出去旅游啦~,小s同学住的宾馆每天早上都会提供丰盛的自助早餐,小s同学最爱吃的就是现烤的切片面包。但是呢,宾馆的烤面包机很差,虽然说每次最多可以同时烤k块面包,但是只能烤好这些面包的一个面。小s要想吃上好吃的面包,就需要把面包的两面都烤好。小s同学一共想吃n块烤面包,但是小s每天都有好多景点需要游览,她不能在早餐上耽误很长时间,因此,小s同学希望你能告诉她最少需要使用几次烤面包机就可以烤好n块面包。
输入
输入数据仅有一行包含两个用空格隔开的正整数n和k(n, k
<=10),n表示小s同学一共要烤n块面包,k表示宾馆的烤面包机一次最多可以同时烤好k块面包的一个面。
输出
仅有一行包含一个整数,表示小s同学至少要用多少次烤面包机。
样例输入
3 2
样例输出
3
提示
样例解释
假设面包的两面分别标记为A和B,小s同学第一次烤1号和2号面包的A面,第2次烤3号面包的A面和1号面包的B面,第3次烤2号和3号面包的B面,这是使用烤面包机次数最少的方案。
数据范围
10%的数据满足k<=1
50%的数据满足k<=4
100%的数据满足n<=10, k<=10
var n,k:integer;
begin
read(n,k);
if n<=k then write(2)
else write((n*2-1) div k +1);
end. 输入10 10 输出2
输入9 6 输出 3 输入10 8 输出 3
输入5 8 输出 2
n>k的情况下总可以把面包分均匀,最后只剩下<=k个一面的面包没拷
世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才,A 市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的150%划定,即如果计划录取m名志愿者,则面试分数线为排名第m*150%(向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数线的所有选手。现在就请你编写程序划定面试分数线,并输出所有进入面试的选手的报名号和笔试成绩。【输入】输入文件名为score.in。第一行,两个整数n,m(5 ≤ n ≤ 5000,3 ≤ m ≤ n),中间用一个空格隔开,其中n 表示报名参加笔试的选手总数,m 表示计划录取的志愿者人数。输入数据保证m*150%向下取整后小于等于n。第二行到第n+1 行,每行包括两个整数,中间用一个空格隔开,分别是选手的报名号k(1000 ≤ k ≤9999)和该选手的笔试成绩s(1 ≤ s ≤ 100)。数据保证选手的报名号各不相同。【输出】输出文件score.out。第一行,有两个整数,用一个空格隔开,第一个整数表示面试分数线;第二个整数为进入面试的选手的实际人数。从第二行开始,每行包含两个整数,中间用一个空格隔开,分别表示进入面试的选手的报名号和笔试成绩,按照笔试成绩从高到低输出,如果成绩相同,则按报名号由小到大的顺序输出。【输入输出样例】
score.in score.out
6 3 88 5
1000 90 1005 95
3239 88 2390 95
2390 95 1000 90
7231 84 1001 88
1005 95 3239 88
1001 88
【样例说明】m*150% = 3*150% = 4.5,向下取整后为4。保证4 个人进入面试的分数线为88,但因为88
有重分,所以所有成绩大于等于88 的选手都可以进入面试,故最终有5 个人进入面试。
【分析】本题是一道典型的排序题。我们可以先将选手按成绩与序号进行多关键字排序(成绩优先)在将他们顺序输出前m*150%个,输出的时候注意一下重分的处理,因为有些选手成绩可能为0。先将由于数据量太小选排都可以在考场上拿高分。
var
a:array[1..100,1000..9999] of longint;
b:array[1..100] of longint;
i,j,k,l,m,n,x,y,max:longint;
begin
assign(input,'score.in');reset(input);
assign(output,'score.out');rewrite(output);
readln(n,m);
fillchar(a,sizeof(a),0);
for i:=1 to n do
begin
readln(x,y); inc(a[y,x]); inc(b[y]);
end;
m:=trunc(m*1.5);
max:=0;k:=0;
for i:=100 downto 1 do
if max begin inc(max,b[i]);k:=i;end else break; writeln(k,' ',max); for i:=100 downto k do begin x:=0; for j:=1000 to 9999 do begin if x>=b[i] then break; if a[i,j]=1 then begin writeln(j,' ',i); inc(x); end; end;