1015. 德才論
阿新 • • 發佈:2018-02-26
++ div string 記錄 格式 sum mic idt clas
題目截圖:
思路:
可以設置 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\n", 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("\n"); 70 } 71 } 72 73 return 0; 74 }
1015. 德才論