题解:P5741 【深基7.例10】旗鼓相当的对手 - 加强版
Dont_Be_Afraid · · 题解
题目传送门
$2025.7.3$ 修正了一处拼写错误,十分感谢 [HuangHouze](https://www.luogu.com.cn/user/1650579)。
首先,要解决存储学生信息的问题。很明显,需要采用结构体。在结构体中,需要存储如下信息:
- 姓名;
- 语文成绩;
- 数学成绩;
- 英语成绩;
- 总分。
于是,先定义一个能存储这一坨东西的结构体。
struct stu {
string name;
int chinese, math, english, total;
} a[1001];
其次,就是输入,在输入时,顺便把总分也求了。
for (int i = 0; i < n; i++) { // n 为学生总数
cin >>
a[i].name >>
a[i].chinese >>
a[i].math >>
a[i].english;
a[i].total = a[i].chinese + a[i].math + a[i].english;
}
然后,就要判断“某对学生
bool qwq(stu a, stu b) {
if (
abs(a.chinese - b.chinese) <= 5 &&
abs(a.math - b.math) <= 5 &&
abs(a.english - b.english) <= 5 &&
abs(a.total - b.total) <= 10
)
return 1;
else return 0;
}
接着,就需要使用枚举,通过枚举每一对同学,找出旗鼓相当的对手。具体方法可以参考一年级时数线段的方法:
如图,先枚举端点
最后,如果枚举到了旗鼓相当的对手,则直接输出姓名。
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (qwq(a[i], a[j]))
cout << a[i].name << " " << a[j].name << endl;
}
}
在文章的结尾,为大家奉上满分代码:
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
struct stu {
string name;
int chinese, math, english, total;
} a[1001];
bool qwq(stu a, stu b) {
if (
abs(a.chinese - b.chinese) <= 5 &&
abs(a.math - b.math) <= 5 &&
abs(a.english - b.english) <= 5 &&
abs(a.total - b.total) <= 10
)
return 1;
else return 0;
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i].name >>
a[i].chinese >>
a[i].math >>
a[i].english;
a[i].total = a[i].chinese + a[i].math + a[i].english;
}
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (qwq(a[i], a[j]))
cout << a[i].name << " " << a[j].name << endl;
}
}
return 0;
}