PAT Ranking (排名)

PAT Ranking (排名)

 

 

Programming Ability Test (PAT) is organized by the College of Computer Science and Technology of Zhejiang University. Each test is supposed to run simultaneously in several places, and the ranklists will be merged immediately after the test. Now it is your job to write a program to correctly merge all the ranklists and generate the final rank.

 

 Input Specification:

 

Each input file contains one test case. For each case, the first line contains a positive number N (<=100), the number of test locations. Then N ranklists follow, each starts with a line containing a positive integer K (<=300), the number of testees, and then K lines containing the registration number (a 13-digit number) and the total score of each testee. All the numbers in a line are separated by a space.

 

 Output Specification:

 

For each test case, first print in one line the total number of testees. Then print the final ranklist in the following format:

 

registration_number final_rank location_number local_rank

 

The locations are numbered from 1 to N. The output must be sorted in nondecreasing order of the final ranks. The testees with the same score must have the same rank, and the output must be sorted in nondecreasing order of their registration numbers.

Sample Input:

2

5

1234567890001 95

1234567890005 100

1234567890003 95

1234567890002 77

1234567890004 85

4

1234567890013 65

1234567890011 25

1234567890014 100

1234567890012 85

 Sample Output:

9

1234567890005 1 1 1

1234567890014 1 2 1

1234567890001 3 1 2

1234567890003 3 1 2

1234567890004 5 1 4

1234567890012 5 2 2

1234567890002 7 1 5

1234567890013 8 2 3

1234567890011 9 2 4

 

 

先分组排名,再全部排名

 

  1 #include <iostream>

  2 

  3 #include <string>

  4 

  5 #include <algorithm>

  6 

  7 #include <vector>

  8 

  9 using namespace std;

 10 

 11  

 12 

 13 struct stu

 14 

 15 {

 16 

 17    int loc,frank,lrank,gra;

 18 

 19    string name;

 20 

 21 };

 22 

 23  

 24 

 25  

 26 

 27 bool cmp(stu s1,stu s2)

 28 

 29 {

 30 

 31     if(s1.frank==s2.frank)

 32 

 33     return s1.name<s2.name;

 34 

 35  

 36 

 37       return s1.frank<s2.frank;

 38 

 39 }

 40 

 41  

 42 

 43 bool cmpg(stu s1,stu s2)

 44 

 45 {

 46 

 47  

 48 

 49       return s1.gra>s2.gra;

 50 

 51 }

 52 

 53  

 54 

 55 int main()

 56 

 57 {

 58 

 59  

 60 

 61   int n;int k;int rank,count;

 62 

 63   int i,j;

 64 

 65     while(cin>>n)

 66 

 67   {

 68 

 69       vector<stu> total;

 70 

 71      for(i=1;i<=n;i++)

 72 

 73      {

 74 

 75          cin>>k;

 76 

 77             vector<stu> s(k);

 78 

 79         for(j=0;j<k;j++)

 80 

 81             {

 82 

 83                cin>>s[j].name>>s[j].gra;

 84 

 85                s[j].loc=i;

 86 

 87             }

 88 

 89             sort(s.begin(),s.end(),cmpg);

 90 

 91             count=1;

 92 

 93             s[0].lrank=1;

 94 

 95             total.push_back(s[0]);

 96 

 97             for(j=0;j<k-1;j++)

 98 

 99             {

100 

101                   if(s[j].gra==s[j+1].gra)

102 

103                   {

104 

105                         s[j+1].lrank=s[j].lrank;

106 

107                         count++;

108 

109                   }

110 

111                   else

112 

113                   {

114 

115                       s[j+1].lrank=s[j].lrank+count;

116 

117                         count=1;

118 

119                   }

120 

121                   total.push_back(s[j+1]);

122 

123             }

124 

125      }

126 

127  

128 

129           sort(total.begin(),total.end(),cmpg);

130 

131           count=1;

132 

133             total[0].frank=1;

134 

135             for(j=0;j<total.size()-1;j++)

136 

137             {

138 

139                   if(total[j].gra==total[j+1].gra)

140 

141                   {

142 

143                         total[j+1].frank=total[j].frank;

144 

145                         count++;

146 

147                   }

148 

149                   else

150 

151                   {

152 

153                       total[j+1].frank=total[j].frank+count;

154 

155                         count=1;

156 

157                   }

158 

159             }

160 

161  

162 

163             sort(total.begin(),total.end(),cmp);

164 

165             cout<<total.size()<<endl;

166 

167             for(i=0;i<total.size();i++)

168 

169                   cout<<total[i].name<<" "<<total[i].frank<<" "<<total[i].loc<<" "<<total[i].lrank<<endl;

170 

171    

172 

173   }

174 

175   return 0;

176 

177 }

178 

179  
View Code

 

你可能感兴趣的:(rank)