参赛选手身高问题II
总提交 : 512 测试通过 : 63
比赛描述
2013“华为杯”南京邮电大学大学生团体歌唱大赛即将在南邮举行,本次大赛由南京邮电大学大学生就业与创业指导中心主办,南京邮电大学华为俱乐部(Huawei Club)和南京邮电大学学生职业发展协会(SCDA)联合承办,华为技术有限公司提供赞助。
为了展示南邮学子风采,大赛组委会规定:每个参赛团体由3名同一年级在校本科生或硕士研究生选手组成,3名选手按照身高等差排列,例如参赛团体中3个选手身高依次为160厘米、170厘米、180厘米,则该团体报名成功。
在此次大赛中,每一个参赛团队根据报名先后次序、3个选手身高排列生成一个队名,具体命名方式如下:每一个参赛团队3个选手的身高按照从矮到高的次序组成一个排列,所有这些排列按字典序进行排序,这时排序相同时,再按照报名先后次序确定顺序,对应的参赛团队获得一个顺序编号;“2013hwt”和顺序编号组合即为参赛团队的队名。
举一个例子,有以下5个参赛团队报名信息,相应的顺序编号和队名如下:
报名次序 | 选手身高信息 | 顺序编号 | 队名 |
1 | 180 160 170 | 2 | 2013hwt2 |
2 | 160 180 170 | 3 | 2013hwt3 |
3 | 170 170 170 | 4 | 2013hwt4 |
4 | 190 170 180 | 5 | 2013hwt5 |
5 | 140 150 160 | 1 | 2013hwt1 |
输入
输入包括N+1行,首先给出参赛团队数N,接着根据报名先后次序给出N行,每1行依次给出某个参赛团队报名次序C、3个选手任意次序的身高值,1≤N≤30000,1≤C≤N,身高值不低于140厘米、不高于230厘米。
输出
按照报名先后次序输出N行,每1行依次给出相应参赛团队的报名次序和生成的队名。
样例输入
5
1 180 160 170
2 160 180 170
3 170 170 170
4 190 170 180
5 140 150 160
样例输出
1 2013hwt2
2 2013hwt3
3 2013hwt4
4 2013hwt5
5 2013hwt1
提示
本题纯属虚构,题目中输入数据和输出数据在一行中均以空格分隔。
对给定的字符集或数集中的字符或数规定一个先后关系,在此基础上规定两个排列的先后是从左到右逐个比较对应字符的先后,或者根据给定的数集中的数值大小关系,规定两个排列的先后是从左到右逐个比较对应的数值的大小,即依照字典序给出排列次序。
题目来源
SED
#include<iostream>
#include<algorithm>
using namespace std;
#define MAX_N 30000
struct team{
int order;
int height;
int out;
}ts[MAX_N];
bool operator<(const team &t1, const team &t2){
if(t1.height == t2.height){
return t1.order < t2.order;
}
return t1.height < t2.height;
}
bool comp(const team &t1, const team &t2){
return t1.order < t2.order;
}
int main(){
int n,i,x,y,z;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d%d%d%d",&ts[i].order,&x,&y,&z);
if(x<=y && x<=z){
if(y<=z){
ts[i].height = x*1000000+y*1000+z;
}else{
ts[i].height = x*1000000+z*1000+y;
}
}else if(y<=x && y<=z){
if(x<z){
ts[i].height = y*1000000+x*1000+z;
}else{
ts[i].height = y*1000000+z*1000+x;
}
}else{
if(x<=y){
ts[i].height = z*1000000+x*1000+y;
}else{
ts[i].height = z*1000000+y*1000*x;
}
}
}
sort(ts,ts+n);
for(i=0;i<n;i++){
ts[i].out = i+1;
}
sort(ts,ts+n,comp);
for(i=0;i<n;i++){
printf("%d 2013hwt%d\n",i+1,ts[i].out);
}
}