运动会(sort+结构体+分段sort)

运动会


Time limit: 1000MS    Memory limit: 32768K
Total Submit: 53    Accepted: 27

学校一年一度的运动会开始了,由于参加的运动员人数相当多使得名单变得杂乱无章,现在给你一张名单让你对这张名单进行排序,使得排序后变得清晰一点。
input
输入一个整数N(N<10000)代表名单上的人数
接下来N行,每行3个整数K,V,P分别代表他们的运气值、实力值和序号(保证没有相同的序号)。
output
经过排序后输出N行(排序时实力值大的优先,实力值相同则运气值大的优先,如果实力值和运气值都相同则序号小的优先)。
每行输出一个序号。


sample input
5
3 3 2
4 4 3
5 5 1
6 6 4
7 6 5

sample output
5
4
1
3
2

#include<stdio.h>
#include
<algorithm>
#define MAX 10001
using namespace std;
struct ORDER
{
int k;
int v;
int p;
}order[MAX];
bool cmp_v(ORDER a,ORDER b) //对结构体中不同成员sort,用不同的cmp函数
{
return a.v > b.v;
}
bool cmp_k(ORDER a,ORDER b)
{
return a.k > b.k;
}
bool cmp_p(ORDER a,ORDER b)
{
return a.p < b.p;
}

int main()
{


int n, i, j;
while(scanf("%d", &n) != EOF)
{
for(i=0; i<n; i++)
scanf(
"%d%d%d", &order[i].k, &order[i].v, &order[i].p);
sort(order, order
+n, cmp_v);

for(i=0; i<n-1;)
{
if(order[i].v == order[i+1].v) //找出相同数值段,按题意进行sort
{
for(j=i+1; j<n; j++)
if(order[i].v != order[j].v)
break;
sort(order
+i, order+j, cmp_k); //这里用的非常妙,传参直接 变量名+i,变量名+j
i = j;
}
else
i
++;
}
for(i=0; i<n-1;)
{
if(order[i].k == order[i+1].k)
{
for(j=i+1; j<n; j++)
if(order[i].k != order[j].k)
break;
sort(order
+i, order+j, cmp_p);
i
= j;
}
else
i
++;
}

for(i=0; i<n; i++)
printf(
"%d\n", order[i].p);
}
return 0;
}
原文地址:https://www.cnblogs.com/submarinex/p/1941261.html