[传智杯 #2 初赛] 软件工程实习

题目描述

某大学的《软件工程》必修课分为理论和实践部分。理论部分由该校教授完成授课;而实践部分是由第三方的公司主导,需要同学们在五周时间内自学 HTML、css、JavaScript、vue、Python、django 等技术,并组队完成一个真实的互联网商业应用。

参与这个课程的有 n(0≤n≤1000) 个学生,分成了不超过 2626 个队伍,每个队伍用 A 到 Z 来表示。每个队伍都会完成一个项目,并以队伍为单位,给所有队伍(包括自己队伍)打分,范围是 0到 100 的整数。

为了平息学生对这门课产生的出多问题的不满(比如工作量太大、时间过于紧张、考核方式不公平等),老师决定使用一种“看起来”很公平的方式来决定每组队伍的项目得分:

对于某个队伍,首先计算所有队伍(包括自己)给这个队伍评分的平均值,然后剔除掉和这个平均值差别超过 15 分的评分(保证不会出现所有的评分全部被剔除的情况),最后再对剩余的评分求平均值,四舍五入取整后作为这个队伍的项目得分。

对于每一个同学,我们已经得知他们的队伍代号和理论成绩(也是 00 到 100100 分的整数)。这位同学的最后得分就是 60% 的理论成绩加上 40% 的所在队伍的项目得分,然后四舍五入取整。

现在老师想知道所有同学的分数排行。请按最后得分从高到低的顺序,输出每位同学的得分和他所在的队伍。

输入格式

第一行两个整数 n 和 k,分别表示学生数和队伍数。

接下来 n 行,每行一个整数 si​ 和一个大写字母 ci​,表示第 i 个选手的理论分数和队伍编号。保证队伍编号范围是从 A 开始后连续 k 个字母中的一个。

接下来 k 行,每行 k 个整数。其中第 i 行第j 列的整数ai,j​ 表示第 i 个队伍给第 j 个队伍的评分,当 i=j 时,就是自评。

输出格式

输出 n 行表示答案,得分高的同学优先输出,得分相同时队伍编号较小的同学优先输出。对于每一行,先输出这位同学成绩,然后输出代表他的队伍编号的大写英文字母。

输入输出样例

输入 #1复制

6 3
70 A
80 A
65 B
95 B
85 C
90 C
70 90 100
95 88 85
30 47 100

输出 #1复制

93 B
92 C
89 C
76 A
75 B
70 A

说明/提示

A 组收到的分数分别是 70,95,30,其平均分为 665,则 95,30 被作为无效成绩剔除,因此 A 组的项目得分是 70 分。
B 组收到的分数分别是 90,88,47,其平均分为 75,则 47 被作为无效成绩剔除,因此 B 组的项目得分是 89 分。
C 组收到的分数分别是100,85,100,其平均分为 95,没有打分被剔除,因此 C 组的项目得分是 95 分。

#include<bits/stdc++.h>
using namespace std;
int n,k;char c;
double team[1001],b[1001][1001]; //team[i]表示第i个队伍项目得分,b[i][j]表示队伍i对队伍j的评分 
struct stu{
	int s,bel,ans;//s是理论成绩,bel是属于哪个队伍,ans则为总成绩 
}a[1001];
inline bool cmp(stu x,stu y){//结构题排序(一定要用bool,不然会爆0(我也不知道为啥)) 
	if(x.ans==y.ans) return x.bel<y.bel;
	return x.ans>y.ans;
}
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i].s>>c;
		a[i].bel=c-'A'+1;//处理队伍编号 
	}
	for(int i=1;i<=k;i++)
		for(int j=1;j<=k;j++)
			cin>>b[i][j];
	for(int i=1;i<=k;i++){
		double tot=0,ave=0;int t=0;//tot表示总和,ave表示平均数,t表示有多少个数不会被剔除 
		for(int j=1;j<=k;j++) tot+=b[j][i];
		ave=tot/k;
		for(int j=1;j<=k;j++){
			if(fabs(b[j][i]-ave)>15) 
tot-=b[j][i],b[j][i]=0;//如果与平均数相差超过(即大于)15,则剔除 
			else t++;
		}
		team[i]=(int)(tot/t+0.5);//求平均+四舍五入 (int)(xxxx+0.5)
	}

	for(int i=1;i<=n;i++) 
a[i].ans=a[i].s*1.0*0.6+team[a[i].bel]*1.0*0.4+0.5;//算总成绩 

	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++) 
printf("%d %c\n",a[i].ans,a[i].bel+'A'-1);
}

第六届传智杯B组初赛是传智播客举办的一次IT技术竞赛的初赛阶段,旨在选拔出各高校优秀的程序设计人才。该比赛中,参赛者将面临多道编程题目,通过编写程序解决问题来展示他们的技术水平和创新能力。 在初赛中,参赛者需要在规定的时间内完成多道程序设计题目。这些题目可能涉及数据结构算法、网络通信等方面的知识,要求参赛者具备扎实的编程基础和解决实际问题的能力。 参赛者需要在规定的时间内完成编程题目,并提交给评委进行评分。评委会根据答案的正确性、效率、代码的可读性等方面对参赛者的作品进行综合评判。最终,得分高的参赛者将进入下一轮比赛。 第六届传智杯B组初赛的目的是为了选拔出具备优秀编程能力的学生,为他们提供一个展示才华、学习交流的平台。参赛者不仅可以通过比赛锻炼自己的编程技巧,还可以结识其他优秀的参赛者,相互学习、切磋技艺。 在比赛过程中,参赛者还可以通过与其他选手交流,了解各种不同的编程思路和解题方法,不断提高自己的编程水平。同时,参赛者还有机会与业界的专家学者进行交流,了解最新的技术动态和发展趋势。 总之,第六届传智杯B组初赛是一次很有意义的编程竞赛,为各大高校的IT人才选拔提供了一次难得的机会。通过比赛,参赛者可以展现自己的才华,提升技术水平,同时也可以与其他优秀选手进行交流,共同进步。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鑫鑫向栄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值