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

· · 题解

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

题目传送门

分析题目,我们有两种选择,一种结构体,一种数组,显然结构体更简单易懂。所以我们先定义一个存放名字和语数英三科成绩的结构体。

struct stu{
    string e; //姓名
  int a; //语文
    int b; //数学
    int c; //英语
}q[1005];

接着看题,如果两对同学的每一科分差都不大于 5 分,且总分差不大于 10 分,就是“旗鼓相当的对手”。所以我们先按字典序排序,再用双层循环来判断。

但我们并不用担心负数的情况,因为有 abs 这个好东西。 可以取绝对值。

for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            if(q[i].e>q[j].e){ //如果字典序小就在前面
                swap(q[i].e,q[j].e);
                swap(q[i].a,q[j].a);
                swap(q[i].b,q[j].b);
                swap(q[i].c,q[j].c);
            }
        }
    } 
if(abs(q[i].a-q[j].a)<=5&&abs(q[i].b-q[j].b)<=5&&abs(q[i].c-q[j].c)<=5&&abs(q[i].a+q[i].b+q[i].c-(q[j].a+q[j].b+q[j].c))<=10) //判断是否为旗鼓相当的对手
  cout<<q[i].e<<" "<<q[j].e<<endl; //如果是就输出

最后贴完整代码:

#include<bits/stdc++.h>
using namespace std;
int s;
struct stu{ 
    string e;
    int a;
    int b;
    int c;
}q[1005];
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>q[i].e>>q[i].a>>q[i].b>>q[i].c;
    } 
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            if(q[i].e>q[j].e){
                swap(q[i].e,q[j].e);
                swap(q[i].a,q[j].a);
                swap(q[i].b,q[j].b);
                swap(q[i].c,q[j].c);
            }
        }
    } 
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            if(abs(q[i].a-q[j].a)<=5&&abs(q[i].b-q[j].b)<=5&&abs(q[i].c-q[j].c)<=5&&abs(q[i].a+q[i].b+q[i].c-(q[j].a+q[j].b+q[j].c))<=10)
                cout<<q[i].e<<" "<<q[j].e<<endl;
        }
    } 
    return 0;
}