小白的名次 题目描述
兔子小白是位数学爱好者,有一次它参加了兔界里的数学比赛,成绩公布后,小白很想知道自己的成绩到底排第几,现在请你帮它编一个程序,要求输入一个成绩,就能知道相应的名次。注意:同分的按相同名次算,且只算一次。 输入
输入共三行。
第一行:一个整数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; end; close(input);close(output); end. 有形如:ax3+bx2+cx+d=0这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后4位。 【分析】如果根与根之差的绝对值>=1,则把-100到100划分成每对连续整数为上下界的区间,这个区间中不可能存在两个值,所以以此为上下界枚举每一个区间,然后采用二分法逐渐缩小根的范围,从而得到根的某精度的数值,连续找到3个数就可以了。 Program fangchen; Var a,b,c,d:real; i,k:integer; ans:array[1..3]of real; function f(x:real):real; begin exit(x*x*x*a+x*x*b+x*c+d);end; Procedure find(l,r:double); Var mid:double; Begin if (r-l<0.001) then begin if (l-ans[k]-1>=0)or(k=0) then begin inc(k); ans[k]:=l; end; exit; end; mid:=(l+r)/2; if (a*l*l*l+b*l*l+c*l+d)*(a*mid*mid*mid+b*mid*mid+c*mid+d)<=0 then find(l,mid) else find(mid,r); End; Begin readln(a,b,c,d); k:=0; for i:=-100 to 99 do if ((f(i)*f(i+1))<=0)and(k<3)then find(i,i+1); for i:=1 to k do write(ans[i]:0:2,' '); End.

