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

· · 题解

P5741 题解:

简单版题目传送门

加强版题目传送门

主要思路:

用变量存储每个学科分数的差 a1,b1,c1 和总分的差 z1,如果每个学科的分差 a1,b1,c1 \le 5 并且 z1 \le 10,则这两个学生就是旗鼓相当的对手,将这两个学生的名字存起来,最后按题目要求排序后再输出。

代码实现:

代码片段分析:

Part1 定义变量:

int n;
int k=0;
struct stu{
    string s;
    int a,b,c,z;
}a[101000];
struct node{
    string s,t;
}id[101000];

Part2 求分数差:

双层循环遍历 a 数组,变量 a1,b1,c1 分别存储每科的分差,z1 存储总分分差。

    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            int a1=max(a[i].a,a[j].a)-min(a[i].a,a[j].a);
            int b1=max(a[i].b,a[j].b)-min(a[i].b,a[j].b);
            int c1=max(a[i].c,a[j].c)-min(a[i].c,a[j].c);
            int z1=max(a[i].z,a[j].z)-min(a[i].z,a[j].z);
            if(a1<=5&&b1<=5&&c1<=5&&z1<=10){
                k++;
                id[k].s=a[i].s;
                id[k].t=a[j].s;
            }
        }

Part3 排序函数:

按题目的排序要求模拟就可以了。(~我的写的太烂,详见楼下 dalao~)

inline bool cmp(node x,node y){
    if(x.s>x.t){
        swap(x.s,x.t);
    }
    if(y.s>y.t){
        swap(y.s,y.t);
    }
    if(x.s==y.s){
        return x.t<y.t;
    }
    return x.s<y.s;
}

Part4 AC Code:

~码风很烂,dalao 勿喷。~

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n;
int k=0;
struct stu{
    string s;
    int a,b,c,z;
}a[101000];
struct node{
    string s,t;
}id[101000];
inline bool cmp(node x,node y){
    if(x.s>x.t){
        swap(x.s,x.t);
    }
    if(y.s>y.t){
        swap(y.s,y.t);
    }
    if(x.s==y.s){
        return x.t<y.t;
    }
    return x.s<y.s;
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i].s>>a[i].a>>a[i].b>>a[i].c;
        a[i].z=a[i].a+a[i].b+a[i].c;    
    }
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            int a1=max(a[i].a,a[j].a)-min(a[i].a,a[j].a);
            int b1=max(a[i].b,a[j].b)-min(a[i].b,a[j].b);
            int c1=max(a[i].c,a[j].c)-min(a[i].c,a[j].c);
            int z1=max(a[i].z,a[j].z)-min(a[i].z,a[j].z);
            if(a1<=5&&b1<=5&&c1<=5&&z1<=10){
                k++;
                id[k].s=a[i].s;
                id[k].t=a[j].s;
            }
        }
    }
    sort(id+1,id+k+1,cmp);
    for(int i=1;i<=k;i++){
        cout<<id[i].s<<" "<<id[i].t<<endl;
    }
    return 0;
}

~求过~