1. 程式人生 > 其它 >獎學金(歸併排序)

獎學金(歸併排序)

http://noi.openjudge.cn/ch0110/04/
 1 #include <iostream>
 2 using namespace std;
 3 
 4 struct score{
 5     int num;
 6     int chs;
 7     int sum;
 8 } sco[300], r[300];
 9 
10 void value(score*, score*);
11 void msort(int, int);
12 
13 int main() {
14     int n, c, m, e;
15     cin >> n;
16     for (int i=0; i<n; i++) {
17 cin >> c >> m >> e; 18 sco[i].chs = c; 19 sco[i].sum = c+m+e; 20 sco[i].num = i; 21 } 22 msort(0, n-1); 23 for (int i=0; i<5; i++) 24 cout << sco[i].num+1 << " " << sco[i].sum << endl; 25 return 0; 26
} 27 28 void value(score* x, score* y) { 29 x->sum = y->sum; 30 x->num = y->num; 31 x->chs = y->chs; 32 } 33 34 void msort(int s, int t) { 35 if (s==t) return; 36 int mid=(s+t)/2; 37 msort(s, mid); 38 msort(mid+1, t); 39 int i=s, j=mid+1, k=s; 40 while
(i<=mid && j<=t) 41 if (sco[i].sum>sco[j].sum) { 42 value(&r[k], &sco[i]); k++; i++; 43 } else if (sco[i].sum<sco[j].sum) { 44 value(&r[k], &sco[j]); k++; j++; 45 } else { 46 if (sco[i].chs>=sco[j].chs) { 47 value(&r[k], &sco[i]); k++; i++; 48 } else { 49 value(&r[k], &sco[j]); k++; j++; 50 } 51 } 52 while (i<=mid) { 53 value(&r[k], &sco[i]); k++; i++; 54 } 55 while (j<=t) { 56 value(&r[k], &sco[j]); k++; j++; 57 } 58 for (int i=s; i<=t; i++) value(&sco[i], &r[i]); 59 }