解题思路:首先用结构体记录每个队员的理论成绩和所在队伍,建立一个队伍总分数组和平均数数组和(与该队伍平均分差值在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";
}
运行结果: