考察结构体排序,给每个选手记一个结构体,存放他的答案、得分、名字,在排序的时候自定义一个 < 运算,如果分数相同按照姓名的字典序排序即可。

对于计算分数,我们可以考虑把 100100 分分成 nn 份,每答对一道题就分配 100n\dfrac{100}{n} 分给这位同学即可,由于 nn 并不大,我的精度设置成 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;
}