L1-8 vivo50!

又到了一年一度评奖学金的时候,duoka迫切地想知道班里有谁能够获得奖学金,并打算让这些同学v她50吃开封菜。但评奖名单迟迟未发布,于是duoka找到了班里同学的绩点和评分等信息,决定先自己算一算有哪些同学能获得奖学金。

duoka学校的奖学金是将同学们按照总评成绩进行排名,在本学年未挂过科的同学中,总评排名前K名的同学能够获得数额不等的奖学金。

同学们的总评成绩由以下几个部分构成:绩点分,德育分,智育分,是否挂科。

绩点分:学生的绩点一般表示为五分制绩点,绩点分 = (五分制绩点*10)+50。

德育分:每位同学有70分的基础分,再加上该同学的申报分数即为总德育分,但德育分总计不能超过100分。

智育分:无基础分,同学的申报分数即为智育分得分,且无上限。

总评成绩的计算公式为:

总评 = (绩点分+智育分)∗0.7+德育分∗0.3。

注意:如果该同学有挂科情况,则无论总评成绩为多少,都不参与奖学金评定。

请你输出能够获得奖学金的同学的排名、姓名和总评成绩。

输入格式:

第一行输入两个整数,分别表示班里学生人数N(1≤N≤2×104),奖学金名额K(1≤K≤100)。

之后N行每行输入一组学生的信息,格式如下:

姓名 五分制绩点 德育分申报分 智育分申报分 是否挂科

其中姓名为长度不超过10、不含空格的由小写字母组成的字符串,五分制绩点为闭区间 [0,5] 内的一位浮点数(一位小数),德育分申报分和智育分申报分均为区间 [0,100] 内的整数,是否挂科用整数01表示,0表示有挂科,1表示没有挂科。

每样信息之间均以空格分隔。题目保证没有重名的同学。

输出格式:

每行按总评成绩非升序输出同学的排名、姓名和总评成绩(保留一位小数),期间以1个空格分隔。

注意:总评成绩相同的同学享有并列的排名,排名并列时,按照姓名的字典序升序输出。

输入样例:

10 5
aaaaa 3.9 40 5 1
bbbbb 4.0 50 0 1
ccccc 4.2 20 48 0
ddddd 3.8 20 1 1
eeeee 2.7 30 50 1
fffff 3.2 30 2 1
ggggg 3.6 25 6 1
hhhhh 2.8 25 14 1
iiiii 3.6 20 10 0
jjjjj 3.9 41 1 1

输出样例:

1 eeeee 118.9
2 aaaaa 95.8
3 bbbbb 93.0
3 jjjjj 93.0
5 ggggg 92.9
5 hhhhh 92.9
#include<iostream>
#include<cmath>
#include<algorithm>

using namespace std;


int n,k;

struct ty
{
	string name;
	double jidian;
	int deyv;
	int zhiyv;
	int p;
	double zong;
	bool operator<(const ty &a)const
	{
		if(abs(zong-a.zong)<0.01)
		{
			return name<a.name;
		}
		return zong>a.zong;
		
	}
};

ty stu[20010];
int cnt;


int main()
{
	cin>>n>>k;
	string name;double jidian;int zhiyv,deyv,gua;
	for(int i=1;i<=n;++i)
	{
		cin>>name>>jidian>>deyv>>zhiyv>>gua;
		if(gua==0)continue;
		
		if(deyv>=30)deyv=100;
		else deyv=70+deyv;
		
		jidian=jidian*10+50;
		
		ty tmp;
		tmp.deyv=deyv,tmp.name=name,tmp.zhiyv=zhiyv,tmp.jidian=jidian,tmp.zong=(jidian+zhiyv)*0.7+deyv*0.3;	
	    stu[++cnt]=tmp;
	}
	
	if(cnt==1)
	{
		cout<<1<<" "<<stu[1].name<<" ";
		printf("%.1f",stu[1].zong);
		return 0;
	}
	
	sort(stu+1,stu+1+cnt);
	
	
	stu[1].p=1;
	
	
	 
	
	for(int i=2;i<=cnt;++i)
	{
		if(stu[i-1].zong-stu[i].zong<0.01)
		{
			stu[i].p=stu[i-1].p;
		}
		else
		{
			stu[i].p=i;
		}
	}
	
	for(int i=1;stu[i].p<=k&&i<=cnt;++i)
	{
		cout<<stu[i].p<<" "<<stu[i].name<<" ";
		printf("%.1f",stu[i].zong);
		cout<<endl;
	}
	
	return 0;
}



 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值