问题 3892 --谁拿了最多奖学金-NOIP2005TGT1

3892: 谁拿了最多奖学金-NOIP2005TGT1

时间限制: 1 Sec  内存限制: 128 MB
提交: 79  解决: 35
[提交][状态][讨论版][数据上传:][下载FPS1元][下载测试数据1元][84kb]

题目描述

 

谁拿了最多奖学金

(scholar.pas/c/cpp

某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,获取的条件各自不同:
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元。

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

输入

输入文件scholar.in的第一行是一个整数N1 <= N <= 100),表示学生的总数。接下来的N行每行是一位学生的数据,从左向右依次是姓名,期末平均成绩,班级评议成绩,是否是学生干部,是否是西部省份学生,以及发表的论文数。姓名是由大小写英文字母组成的长度不超过20的字符串(不含空格);期末平均成绩和班级评议成绩都是0100之间的整数(包括0100);是否是学生干部和是否是西部省份学生分别用一个字符表示,Y表示是,N表示不是;发表的论文数是010的整数(包括010)。每两个相邻数据项之间用一个空格分隔。
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->

输出

输出文件scholar.out包括三行,第一行是获得最多奖金的学生的姓名,第二行是这名学生获得的奖金总数。如果有两位或两位以上的学生获得的奖金最多,输出他们之中在输入文件中出现最早的学生的姓名。第三行是这N个学生获得的奖学金的总数。

样例输入

4
YaoLin 87 82 Y N 0
ChenRuiyi 88 78 N Y 1
LiXin 92 88 N N 0
ZhangQin 83 87 Y N 1

样例输出

ChenRuiyi
9000
28700

提示


问题评估]



这个题目据问题本身而言是相当简单的,没有牵涉到过多的算法,属于普及型试题。同时也是对实际问题一种分析和判断。总的来看,本题在方向上,向现实问题迈出了一步,是信息学和生活有了更多的联系。



问题的算法是模拟。当中唯一的难点就是数据处理,考察点为数据库的建立和统计。



  [程序实现]



         由于程序数据范围只有100,当中不牵涉到数据移动,所以用一个纪录型数组,或者多个数组均可,在这里我们使用纪录型来描述。



         对于输入数据有两种方式来实现。



                   法一〉逐个字符累加。



                            首先定义C:char; 然后利用Until c=‘ ’;作为终止符,将读入的字符连接存储到a[i].name中。



                            代码为:



                                     Repeat read(c); a[i].name:=a[i].name+c; until c=’ ‘;



a[i].name:=copy(a[i].name,1,length(a[i].s)-1);



                            这样做的好处是,后面的值可以直接用read语句读入。但是最后一个值后,要记得readln;



 



                   法二〉一次读入,然后分离。



这样做需要逐个分离,对本题来说稍显复杂,但对NOIP来说此方法必须掌握,有的时候一定要用。



具体实现,读入一个字符串S。利用pos(‘ ‘,s);找出空格位置。再利用Copy函数,和Val函数进行截取,和转换。



部分代码:(s:string;j,ok:integer)



         readln(s);



         j:=pos(‘ ‘,s);



         a[i].name:=copy(s,1,j-1);



         s:= copy(s,j+1,50); //当长度〉字符串长度是,为后面全部截取。



         j:=pos(‘ ‘,s);



         Val(copy(s,1,j-1),a[i].qp,ok);



         s:= copy(s,j+1,50);



…..



对于符号用if语句作一下判断就是了,太easy不写了,后面还有几个值,用同样方法处理就可以了。



         以上完成了数据库的建库工作,后面是统计,当然,我们在没读完一行数据后就可进行统计。用If语句判断他是否能得到相应的分值即可。分5条If语句写,每回可以就加入相应的分值。



         将每个的分值汇总计入到总数变量ZD当中。与当前最大值进行比较,得到Max对应的I值。后面就是输出的问题了。



[小结、注意]



         本题为简单题,只要思路明确清晰,就可AC。时间复杂度O(n)。但有一个细节,ZD变量必须定义Longint或以上类型否则会Error201的。

来源

[提交][状态]