2014noip复赛模拟练习5(答案)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档