天天看点

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

解题思路:首先用结构体记录每个队员的理论成绩和所在队伍,建立一个队伍总分数组和平均数数组和(与该队伍平均分差值在15分以内的人数数组),四舍五入的时候用round函数计算,然后一步一步根据题意算即可

#include<bits/stdc++.h>
using namespace std;
typedef struct stu{
	double a;//理论成绩
	char b;//所在队伍
}Stu;
bool cmp(Stu A,Stu B){
	if(A.a!=B.a)
	return A.a>B.a;
	if(A.b!=B.b)
	return A.b<B.b;
}
int main(){
	int n,m,h;
	cin>>n>>m;
	Stu stu[n];
	double sum[m];//每个队伍队伍总分
	double avg[m];//每个队伍平均分
	int index[m];//最后实际人数
	memset(index,0,sizeof(index));
	memset(avg,0,sizeof(avg));
	int x[m][m];
	for(int i=0;i<n;i++)
		cin>>stu[i].a>>stu[i].b;
	for(int i=0;i<m;i++){
		for(int j=0;j<m;j++){
			cin>>x[i][j];
			sum[j]+=x[i][j];//求每个队伍总分
		}
	}
	for(int i=0;i<m;i++)
		avg[i]=sum[i]/m;//求每个队伍平均分
	memset(sum,0,sizeof(sum));
	for(int i=0;i<m;i++){
		for(int j=0;j<m;j++){
			if(abs(avg[j]-x[i][j])<=15){
				sum[j]+=x[i][j];//去除掉后,实际队伍总分
				index[j]++;//实际队伍总人数
		}
	}
}
	for(int i=0;i<m;i++)
		avg[i]=round(sum[i]/index[i]);//实际队伍平均分
	for(int i=0;i<n;i++){
		stu[i].a=round(stu[i].a*0.6+avg[stu[i].b-'A']*0.4);//计算每个队员得分
	}
	sort(stu,stu+n,cmp);//排序
	for(int i=0;i<n;i++) 
		cout<<stu[i].a<<" "<<stu[i].b<<"\n";
}
           

运行结果:

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

继续阅读