问题描述
某校举办程序设计竞赛初赛,规定3名同学组成一支队伍参赛,报名时为每支队伍分配一个4位数的编号(队伍编号互异),竞赛中每人的最高成绩为200分(因此一支队伍的最高得分为600分)。现在需要根据初赛成绩进行排名,公布进入复赛的队伍,规则如下:
- 若一支队伍中任何2人的成绩相差超过100分,则该队伍不能进入复赛;
- 得分低于400分的队伍不能进入复赛;
- 进入复赛的队伍按照队伍得分降序排列;队伍得分相同时,队伍中最低分数越高,其队伍排名越靠前;若队伍得分和队伍中最低分数都相同,则队伍编号小者排名靠前。
输入说明
输入的第一行为一个正整数n(0<n≤100),表示队伍数。之后分n行,每行4个整数,表示一支队伍的编号和3名队员的成绩。
输出说明
输出进入复赛的队伍。每行表示一支队伍的信息,包括排名序号(从1开始)、队伍编号、队伍得分和3名队员的成绩,按照上面要求的顺序排列,一行内的整数之间用1个空格分隔。
输入样例
6
1001 165 160 180
1002 200 80 190
1003 125 130 150
2001 200 160 195
2005 135 135 135
3006 135 135 125
输出样例
1 2001 555 200 160 195
2 1001 505 165 160 180
3 2005 405 135 135 135
4 1003 405 125 130 150
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
struct que
{
int order;
int sum1;
int sum2;
int sum3;
}a[101];
int min1(int q,int w,int e)
{
int mi;
mi=min(q,w);
mi=min(mi,e);
return mi;
}
bool comp(que x,que y)
{
if(x.sum1+x.sum2+x.sum3!=y.sum1+y.sum2+y.sum3)
return (x.sum1+x.sum2+x.sum3)>(y.sum1+y.sum2+y.sum3);
else if(min1(x.sum1,x.sum2,x.sum3)!=min1(y.sum1,y.sum2,y.sum3))
return min1(x.sum1,x.sum2,x.sum3)>min1(y.sum1,y.sum2,y.sum3);
else return x.order<y.order;
}
int main()
{
int n;
cin>>n;
int count=0;
for(int i=0;i<n;i++)
{
cin>>a[i].order>>a[i].sum1>>a[i].sum2>>a[i].sum3;
if((fabs(a[i].sum1-a[i].sum2)>100)||(fabs(a[i].sum1-a[i].sum3)>100)||(fabs(a[i].sum2-a[i].sum3)>100))
a[i].sum1=a[i].sum2=a[i].sum3=0;
}
sort(a,a+n,comp);
for(int i=0,j=1;i<n;i++)
{
if((a[i].sum1+a[i].sum2+a[i].sum3)>=400)
{
printf("%d %d %d %d %d %d\n",j,a[i].order,a[i].sum1+a[i].sum2+a[i].sum3,a[i].sum1,a[i].sum2,a[i].sum3);
j++;
}
}
return 0;
}