分别在组内排序,先得出组内的排名。最后总体进行排序,得出总体排名。
1 #include <iostream> 2 #include <algorithm> 3 #include <string> 4 #include <cstdio> 5 using namespace std; 6 struct node 7 { 8 string num; 9 int score; 10 int rank[2]; 11 int place; 12 }; 13 bool cmp(node a, node b) 14 { 15 if (a.score == b.score) 16 return a.num < b.num; 17 else 18 return a.score > b.score; 19 } 20 struct node* a = new struct node[30010]; 21 int* front = new int[30010]; 22 int main() 23 { 24 int N; 25 int k = 0; 26 int sum = 0; 27 cin >> N; 28 for (int c = 1; c <= N; c++) 29 { 30 int M = 0; 31 cin >> M; 32 sum += M; 33 int value = k - 1; 34 for (int i = k; i < k + M; i++) 35 { 36 a[i].place = c; 37 cin >> a[i].num; 38 scanf("%d",&a[i].score); 39 front[i] = i; 40 } 41 sort(a + k, a + k + M, cmp); 42 for (int i = k; i < k + M; i++) 43 { 44 if (i == 0 || a[i].score != a[i - 1].score) 45 a[i].rank[0] = i - value; 46 else 47 { 48 front[i] = front[i - 1]; 49 int temp = i; 50 while (front[temp] != temp) 51 { 52 temp = temp - 1; 53 } 54 a[i].rank[0] = temp - value; 55 } 56 } 57 k = k + M; 58 } 59 sort(a, a + sum, cmp); 60 for (int i = 0; i < sum; i++) 61 front[i] = i; 62 for (int i = 0; i < sum; i++) 63 { 64 if (i == 0 || a[i].score != a[i - 1].score) 65 a[i].rank[1] = i + 1; 66 else 67 { 68 front[i] = front[i - 1]; 69 int temp = i; 70 while (front[temp] != temp) 71 { 72 temp = temp - 1; 73 } 74 a[i].rank[1] = temp + 1; 75 } 76 } 77 cout << sum << endl; 78 for (int i = 0; i < sum; i++) 79 { 80 printf("%s %d %d %d",a[i].num.c_str(),a[i].rank[1], a[i].place, a[i].rank[0]); 81 if (i != sum - 1)printf(" "); 82 } 83 delete[]a; 84 delete[]front; 85 return 0; 86 }