【深基7.例10】旗鼓相当的对手 - 加强版 · 教师题解

【深基7.例10】旗鼓相当的对手 - 加强版

解题思路

按输入顺序枚举 i<j 的学生对,同时检查三科差不超过 5、总分差不超过 10。输入姓名已有字典序,因此直接按双重循环顺序输出。

正确性说明

i<j 枚举每个无序对恰好一次,四个条件完全等价于题目定义。先增 i 再增 j 的顺序就是要求的姓名组合字典序。

易错点

每科都要比较绝对差;只比较总分不够。

复杂度

时间 O(N²),空间 O(N)。

参考代码(C++11)

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n;
    cin >> n;
    vector<string> s(n);
    vector<int> a(n), b(n), c(n);
    for (int i = 0; i < n; i++)
        cin >> s[i] >> a[i] >> b[i] >> c[i];
    for (int i = 0; i < n; i++)
        for (int j = i + 1; j < n; j++)
            if (abs(a[i] - a[j]) <= 5 && abs(b[i] - b[j]) <= 5 && abs(c[i] - c[j]) <= 5 &&
                abs(a[i] + b[i] + c[i] - a[j] - b[j] - c[j]) <= 10)
                cout << s[i] << " " << s[j] << "\n";
    return 0;
}
返回题目