题目描述
最近,ACM队将要进行一次万众瞩目的表彰大会,评选规则如下:
1.对一个程序员来说,变秃就意味着变强,所以发量是第一优先级(发量少优先)。
2.对一个程序员来说,拥有女朋友是一件非常值得骄傲的事情,所以女朋友是第二优先级(女朋友多优先)。
3.对一个程序员来说,你的键盘虽然不能让你变强,但它能让你有装X的资本,所有键盘价格是第三优先级(键盘贵优先)。
4.对一个程序员来说,码力同样重要(屁话),所以码力是第四优先级(码力强优先)。
5.如果以上条件完全一样,则按照编号升序排列(按照输入顺序从1到n编号)。
输入
第一行输入一个正整数t,表示测试数据组数。(t<=10)
对于每组测试数据,输入一个n,代表参加表彰大会的人数。(n<=100000)
接下来n行,每行四个整数a,b,c,d,分别表示发量,女朋友数量,键盘价格和码力。(数据范围懒得写了 您们用int就行)
输出
对于每组样例,输出参加表彰大会的所有人的排名情况(即按最终排名输出编号),详见样例。
样例
Input
1
6
1 1 1 2
1 1 1 1
1 1 2 2
1 2 2 2
1 1 1 1
2 2 2 2
Output
4
3
1
2
5
6
分析
考察sort+cmp的使用,详见代码。
代码
#include <bits/stdc++.h>
using namespace std;
struct s
{
int a,b,c,d,no;
}p[100005];
bool cmp(s a,s b)
{
if(a.a!=b.a)
return a.a<b.a;
if(a.b!=b.b)
return a.b>b.b;
if(a.c!=b.c)
return a.c>b.c;
if(a.d!=b.d)
return a.d>b.d;
return a.no<b.no;
}
int main()
{
//freopen("test.in","r",stdin);
//freopen("test.out","w",stdout);
int t,n;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d%d%d%d",&p[i].a,&p[i].b,&p[i].c,&p[i].d);
p[i].no=i;
}
sort(p+1,p+n+1,cmp);
for(int i=1;i<=n;++i)
printf("%d\n",p[i].no);
}
return 0;
}