题目截图:
思路:
可以设置 type 变量,先按 type 排序。然后就是按要求自定义 cmp 函数即可。
代码:
1 /* 2 1015. 德才论 3 */ 4 5 #include <stdio.h> 6 #include <string.h> 7 #include <math.h> 8 #include <stdlib.h> 9 #include <time.h> 10 11 #define maxn 100001 12 typedef struct { 13 int id; // 准考证号 14 int de, cai; // 德分,才分 15 int sum; // 总分 16 int type; // 类别 17 } student; 18 student s[maxn]; 19 int cnt=0; // 记录有资格的考生数量 20 21 // 自定义排序 22 int cmp(const void* a, const void* b) { 23 student* c = (student*)a; 24 student* d = (student*)b; 25 if(c->type == d->type) { // 按类别升序 26 if(c->sum == d->sum) { // 按总分降序 27 if(c->de == d->de) { // 按德分降序 28 return c->id-d->id; // 按准考证号升序 29 } else { 30 return d->de-c->de; 31 } 32 } else { 33 return d->sum-c->sum; 34 } 35 } else { 36 return c->type-d->type; 37 } 38 } 39 40 int main() { 41 int N, L, H, i; 42 int a, b, c, d; // 准考证号,德分,才分,类别 43 scanf("%d %d %d", &N, &L, &H); 44 for(i=0; i<N; ++i) { 45 scanf("%d %d %d", &a, &b, &c); 46 if(b>=L && c>=L) { 47 s[cnt].id = a; 48 s[cnt].de = b; 49 s[cnt].cai = c; 50 s[cnt].sum = b+c; 51 if(b>=H && c>=H) { // 类别1 52 d = 1; 53 } else if(c<H && b>=H) { // 类别2 54 d = 2; 55 } else if(c<H && b<=H && b>=c) { // 类别3 56 d = 3; 57 } else { // 类别4 58 d = 4; 59 } 60 s[cnt++].type = d; 61 } 62 } 63 qsort(s, cnt, sizeof(student), cmp); // 排序 64 // 按格式输出 65 printf("%d ", cnt); 66 for(i=0; i<cnt; ++i) { 67 printf("%d %d %d", s[i].id, s[i].de, s[i].cai); 68 if(i != cnt-1) { 69 printf(" "); 70 } 71 } 72 73 return 0; 74 }