服了……感觉得补点数据结构,很多时候找不到最合适的数据结构,就算找到了也用的不是很熟练
先看看数据结构的课程吧……
这是最后抄的做法,那个重载挺妙的
https://www.acwing.com/solution/content/11072/
// #include <iostream>
// #include <cstring>
// #include <algorithm>
// #include <string>
// #include <map>
// #include <unordered_map>
// #include <set>
// using namespace std;
// const int n = 100 + 5;
// const int k = 300 + 5;
// int K;
// int N;
// int sum = 0;
// // vector<vector<pair<string, int>>> grade_region(n, vector<pair<string, int>>(k));
// vector<pair<string, int>> grade;
// struct stu{
// string registration_number;
// int final_rank;
// int location_number;
// int local_rank;
// int g;
// }stu[n*k], res[n*k];
// int main()
// {
// cin >> N;
// for (int i = 0; i < N; i ++ ) {
// cin >> K;
// // sum += K;
// for (int j = 0; j < K; j ++ ) {
// string x;
// int y;
// cin >> x >> y;
// // cout << x << " " << y << endl;
// // grade_region[i].push_back({x, y});
// grade.push_back({x, y});
// sum ++;
// stu[sum].registration_number = x;
// stu[sum].location_number = i + 1;
// stu[sum].g = y;
// }
// }
// cout << sum << endl;
// for (int i = 0; i < sum; i ++ ) {
// //find_least(grade, i - 1);
// int min_x = 0;
// int index = i;
// for (int j = i; j < sum; j ++ ) {
// if(grade[j].second >= min_x) {
// min_x = grade[j].second;
// index = j;
// }
// }
// if(index != i) {
// string x1 = grade[i].first;
// int y1 = grade[i].second;
// grade[i].first = grade[index].first;
// grade[i].second = grade[index].second;
// grade[index].first = x1;
// grade[index].second = y1;
// }
// }
// // for(int e = 0; e < N; e++) {
// // int s = grade_region[e].size();
// // for (int i = 0; i < s; i ++ ) {
// // cout <<"hello1: " << grade_region[e][i].first << " " << grade_region[e][i].second << endl;
// // }
// // }
// // for(int e = 0; e < N; e++) {
// // int s = grade_region[e].size();
// // cout << s << endl;
// // for (int i = 0; i < s; i ++ ) {
// // //find_least(grade, i - 1);
// // int min_x = 0;
// // int index = i;
// // for (int j = i; j < s; j ++ ) {
// // if(grade_region[e][j].second >= min_x) {
// // min_x = grade_region[e][j].second;
// // index = j;
// // }
// // }
// // if(index != i) {
// // string x1 = grade_region[e][i].first;
// // int y1 = grade_region[e][i].second;
// // grade_region[e][i].first = grade_region[e][index].first;
// // grade_region[e][i].second = grade_region[e][index].second;
// // grade_region[e][index].first = x1;
// // grade_region[e][index].second = y1;
// // }
// // }
// // }
// int rank = 1;
// for(int i = 0; i < sum; i ++) {
// int g = grade[i].second;
// int l = 1;
// while(grade[i + l].second == g) {
// l ++;
// }
// for(int i1 = i; i1 < i + l; i1 ++) {
// long long x = 1L * 9999999999999;
// int idx = i1;
// for (int j = i1; j < i + l; j ++ ) {
// long long tmp = 1L*(atoi(grade[j].first));
// if(x < tmp) {
// // string t1 = ;
// x = 1L*(atoi(grade[j].first));
// idx = j;
// }
// }
// if(idx != i1) {
// string t = grade[idx].first;
// grade[idx].first = grade[i1].first;
// grade[idx].first = t;
// }
// }
// // struct stu{
// // string registration_number;
// // int final_rank;
// // int location_number;
// // int local_rank;
// // int g;
// // }stu[n*k], res[n*k];
// // for (int e = i; e < i + l; e ++) {
// // res[e].registration_number = grade[e].first;
// // res[e].g = g;
// // find_local_num();
// // get_local_rank();
// // }
// i = i + l;
// }
// for (int i = 0; i < sum; i ++ ) {
// // find_least(grade, i - 1);
// cout << grade[i].first << " " << grade[i].second << endl;
// }
// return 0;
// }
#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>
#include <map>
#include <unordered_map>
#include <set>
using namespace std;
const int N = 100 + 5;
const int K = 300 + 5;
int n, k ,c;
struct S {
string registration_number;
int final_rank;
int location_number;
int local_rank;
int score;
bool operator< (S s) {
if(score != s.score) return score >= s.score;
return registration_number < s.registration_number;
}
}s[N*K];
void gen_local_rank(S *l, S *r) {
int num = 2;
int rank = 1;
S *i = l + 1;
l->local_rank = 1;
while(i != r) {
if((i - 1)->score == i->score) i->local_rank = rank;
else i->local_rank = rank = num;
num ++, i ++;
}
}
void gen_final_rank(S* l, S* r)
{
int num = 2;
int rank = 1;
S* i = l + 1;
l -> final_rank = 1;
while (i != r)
{
if ((i - 1) -> score == i -> score)
i -> final_rank = rank;
else
i -> final_rank = rank = num;
num ++, i ++;
}
}
int main() {
cin >> n;
for (int i = 1; i <= n; i ++ ) {
cin >> k;
for (int j = 0; j < k; j ++ ) {
string rn;
int sc;
cin >> rn >>sc;
s[c ++] = {rn, 0, i, 0, sc};
}
sort(s + c - k, s + c);
gen_local_rank(s + c - k, s + c);
}
sort(s, s + c);
gen_final_rank(s, s + c);
cout << c << endl;
for (int i = 0; i < c; i ++ ) {
cout << s[i].registration_number << " " << s[i].final_rank << " " << s[i].location_number << " "<< s[i].local_rank << endl;
}
return 0;
}