Problem 1121 - 排序
/*
Time Limit: 1000MS Memory Limit: 65536KB Difficulty:
Total Submit:
279 Accepted: 109 Special Judge: No DescriptionMSTC里有好多有特长的人,
有些是力量型人才,有些是智力型人才,有些是敏捷型的。
现在告诉你 N 个人, 每个人的力量,智力,敏捷的值,
和每个人的编号。
题目要求你将 N 个部员 按照力量 从大到小 排序, 如果两个部员的力量相同, 则按照 智力 值从大到小排序,
如果
两个部员力量, 智力 都一样,则按照 敏捷从 小 到 大排序。 测试数据保证没有两个部员的 力量, 智力, 敏捷
全部相同。
Input第一行 N :表示有 N 个同学。 ( 1 <= N <= 500 )
接下来 N 行,
第 i 行有 3 个值, ai, bi, ci a 代表 力量, b 代表智力, c 代表敏捷。 编号为 i
( i 是部员的编号, 1
<= i <= N )
Output输出 N 行:
将排序后的部员编号输出。
每行一个编号
Sample
Input
4
2 2 3
2 3 4
4 8 9
2 2 2
Sample
Output
3
2
4
*/
结构体排序,没什么说的,就是多关键字,一遍AC。c语言中用<stdlib.h>的qsort函数就行,注意comp比较函数的写法有个模板,可以按照我的这个写,不要盲目的改,像我这种小白,就老实的按照这个弄吧。。。
1 #include<stdio.h> 2 #include<stdlib.h> 3 typedef struct node 4 { 5 int num; 6 int power; 7 int wise; 8 int quick; 9 }people; 10 people f[510]; 11 int comp(const void *_a,const void *_b) 12 { 13 people *a=(people *)_a; 14 people *b=(people *)_b; 15 if(a->power!=b->power) return a->power<b->power; 16 else if(a->wise!=b->wise) return a->wise<b->wise; 17 else if(a->quick!=b->quick) return a->quick>b->quick; 18 } 19 int main() 20 { 21 int N,i; 22 while(scanf("%d",&N)!=EOF) 23 { 24 for(i=0;i<N;i++) 25 { 26 f[i].num=i+1; 27 scanf("%d %d %d",&f[i].power,&f[i].wise,&f[i].quick); 28 } 29 qsort(f,N,sizeof(people),comp); 30 for(i=0;i<N;i++) 31 printf("%d\n",f[i].num); 32 } 33 return 0; 34 }