题目大意:
需要计算考生在地区中的排名,在所有考生中的排名。
每读入一个地区的考生的信息,就进行排名,每一个考场内的排名计算完毕后再计算总排名。
分析:
1.重载cmp写法:函数名中写小于号
2.push_back的时候注意数据类型一致
3.做排名类题目时,用这个方法 rank = i + 1
满分代码:
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
#define inf 0x3f3f3f3f
typedef long long LL;
using namespace std;
const int MAXN = 110;
/*
题目分析:
1.重载cmp写法:函数名中写小于号
2.push_back的时候注意数据类型一致
3.做排名类题目时,用这个方法 rank = i + 1
*/
struct Student {
string id;
int grade;
int location_number;
int final_rank, local_rank;
// 这里重载必须是小于号
bool operator< (const Student& t) const {
if(grade != t.grade) return grade > t.grade;
return id < t.id;
}
};
// MAXN组的本地排名
vector<Student> loc[MAXN];
// 一个总的排名
vector<Student> all;
int main() {
int n, k;
cin >> n;
for(int i = 1; i <= n; i++) {
int k;
cin >> k;
for(int j = 0; j < k; j++) {
string id;
int grade;
cin >> id >> grade;
// grade中存入:id, grade, location_number 注意数据类型一致
loc[i].push_back({id, grade, i});
}
// auto带引用符 能够提高效率
auto& local = loc[i];
// 本地排序 为本地排名赋值
sort(local.begin(), local.end());
for(int i = 0; i < local.size(); i++) {
if(!i || local[i].grade != local[i-1].grade) {
local[i].local_rank = i+1;
} else {
local[i].local_rank = local[i-1].local_rank;
}
all.push_back(local[i]);
}
}
// 总排序 为总排名赋值
sort(all.begin(), all.end());
for(int i = 0; i < all.size(); i++) {
if(!i || all[i].grade != all[i-1].grade) {
all[i].final_rank = i+1;
} else {
all[i].final_rank = all[i-1].final_rank;
}
}
cout << all.size() << endl;
for(auto& s: all) {
cout << s.id << " " << s.final_rank << " " << s.location_number << " " << s.local_rank << endl;
}
return 0;
}