考察结构体排序,给每个选手记一个结构体,存放他的答案、得分、名字,在排序的时候自定义一个 <
运算,如果分数相同按照姓名的字典序排序即可。
对于计算分数,我们可以考虑把 分分成 份,每答对一道题就分配 分给这位同学即可,由于 并不大,我的精度设置成 1e-9
绰绰有余。
#include<cmath>
#include<cstdio>
#include<string>
#include<iomanip>
#include<iostream>
#include<algorithm>
const int N = (int) 1e5 + 5, M = (int) 1e5 + 5;
struct Node{
std::string ans;
std::string name;
double score;
friend bool operator < (const Node&p, const Node&q) {
if (fabs(p.score - q.score) > 1e-9) return p.score > q.score;
return p.name < q.name;
}
}s[M];
int n, m; std::string ANS;
void calc(int i){
double per = 100. / n, ans = 0;
for (int j = 0; j < n; ++j)
ans += per * (s[i].ans[j] == ANS[j]);
s[i].score = ans;
}
int main(){
std::ios::sync_with_stdio(false);
std::cin >> n >> m >> ANS;
for (int i = 1; i <= m; ++i) {
std::cin >> s[i].name;
std::cin >> s[i].ans;
calc(i);
}
std::stable_sort(s + 1, s + 1 + m);
std::cout << s[1].name << std::endl;
std::cout.setf(std::ios::fixed);
std::cout << std::fixed << std::setprecision(2) << s[1].score << std::endl;
}