您的位置:首页 > 其它

洛谷1051谁拿了最多奖学金

2017-01-12 13:50 197 查看

题目

某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,获取的条件各自不同:

1) 院士奖学金,每人8000元,期末平均成绩高于80分(>80),并且在本学期内发表1篇或1篇以上论文的学生均可获得;

2) 五四奖学金,每人4000元,期末平均成绩高于85分(>85),并且班级评议成绩高于80分(>80)的学生均可获得;

3) 成绩优秀奖,每人2000元,期末平均成绩高于90分(>90)的学生均可获得;

4) 西部奖学金,每人1000元,期末平均成绩高于85分(>85)的西部省份学生均可获得;

5) 班级贡献奖,每人850元,班级评议成绩高于80分(>80)的学生干部均可获得;

只要符合条件就可以得奖,每项奖学金的获奖人数没有限制,每名学生也可以同时获得多项奖学金。例如姚林的期末平均成绩是87分,班级评议成绩82分,同时他还是一位学生干部,那么他可以同时获得五四奖学金和班级贡献奖,奖金总数是4850元。

现在给出若干学生的相关数据,请计算哪些同学获得的奖金总数最高(假设总有同学能满足获得奖学金的条件)。

题解

先依题意算出每个人最多可得的
4000
奖学金数目,放入a[i],然后排序,奖学金为第一关键字,输入顺序为第二关键字。

读入可能会遇到麻烦:用来读入学生姓名的字符串把整行数据都读入了!这时候我们用字符串来解决:


b[i]:=copy(s,1,pos(' ',s)-1);//学生姓名
delete(s,1,pos(' ',s));
val(copy(s,1,pos(' ',s)-1),g1);//期末平均成绩
delete(s,1,pos(' ',s));
val(copy(s,1,pos(' ',s)-1),g2);//班级评议成绩
delete(s,1,pos(' ',s));
g:=s[1];//是否班干部
w:=s[3];//是否西部省份学生
delete(s,1,4);
val(s,x);//发表论文篇数


时间复杂度O(n log n)

代码

var
i,j,n,g1,g2,x,y,ans:longint;
g,w,z:char;
s:string;
a,c:array[1..100]of longint;
b:array[0..100]of string;

procedure qsort(l,r:longint);
var
i,j,key,t,key2,p:longint;
begin
if l>=r then exit;
i:=l; j:=r;
p:=l+random(r-l+1);
key:=a[p];
key2:=c[p];
repeat
while (a[i]>key)or((a[i]=key)and(c[i]<key2)) do inc(i);
while (a[j]<key)or((a[j]=key)and(c[j]>key2)) do dec(j);
if i<=j then
begin
t:=a[i];a[i]:=a[j];a[j]:=t;
t:=c[i];c[i]:=c[j];c[j]:=t;
b[0]:=b[i];b[i]:=b[j];b[j]:=b[0];
inc(i);dec(j);
end;
until i>j;
qsort(l,j);
qsort(i,r);
end;

begin
readln(n);
randomize;
for i:=1 to n do
begin
readln(s);
b[i]:=copy(s,1,pos(' ',s)-1);
delete(s,1,pos(' ',s));
val(copy(s,1,pos(' ',s)-1),g1);
delete(s,1,pos(' ',s));
val(copy(s,1,pos(' ',s)-1),g2);
delete(s,1,pos(' ',s));
g:=s[1];
w:=s[3];
delete(s,1,4);
val(s,x);
if (g1>80)and(x>0) then a[i]:=a[i]+8000;
if (g1>85)and(g2>80) then a[i]:=a[i]+4000;
if g1>90 then a[i]:=a[i]+2000;
if (g1>85)and(w='Y') then a[i]:=a[i]+1000;
if (g2>80)and(g='Y') then a[i]:=a[i]+850;
ans:=ans+a[i];
c[i]:=i;
end;
qsort(1,n);
writeln(b[1]);
writeln(a[1]);
writeln(ans);
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: