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

· · 题解

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

题解

很好的一道结构体练习题,非常适合初学结构体的蒟蒻。(其实我也是)

注意: 输出的姓名是按照字典序来排序的。

在这道题中,“旗鼓相当的对手”指的是每一科分差互相不超过 5 ,且总分分差互相不大于 10 的学生。

首先,我们定义一个结构体,用来存储学生名称、语文成绩、数学成绩、英语成绩和总分。建议变量名写成学科名称,千万不要学习我的作死变量名,变量多了容易分不清。别问我怎么知道的

struct q{
    int a,b,c,zf;
    string d;
}a[1010];

在输入 N 以后,使用 for 循环输入三科成绩,同时存储总分。

for(int i=1;i<=n;i++){
  cin>>a[i].d>>a[i].a>>a[i].b>>a[i].c;
  a[i].zf=a[i].a+a[i].b+a[i].c;
}

然后双层 for 循环枚举每一个学生,寻找旗鼓相当的对手,判断字典序并输出。在判断分差时,可以用绝对值函数。

for(int i=1;i<=n;i++){
  for(int j=i+1;j<=n;j++){
    if(abs(a[i].a-a[j].a)<=5&&abs(a[i].b-a[j].b)<=5&&abs(a[i].c-a[j].c)<=5&&abs(a[i].zf-a[j].zf)<=10){//abs() 绝对值函数
      if(a[i].d<a[j].d) cout<<a[i].d<<" "<<a[j].d<<endl;
      else cout<<a[j].d<<" "<<a[i].d<<endl;
    } 
  }
}

都看懂的同学可以看你们最喜欢的完整 AC 代码咯~~

#include<bits/stdc++.h>
using namespace std;
struct q{
    int a,b,c,zf;
    string d;
}a[1010];//结构体
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i].d>>a[i].a>>a[i].b>>a[i].c;
        a[i].zf=a[i].a+a[i].b+a[i].c;
    }//输入
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            if(abs(a[i].a-a[j].a)<=5&&abs(a[i].b-a[j].b)<=5&&abs(a[i].c-a[j].c)<=5&&abs(a[i].zf-a[j].zf)<=10){
                if(a[i].d<a[j].d) cout<<a[i].d<<" "<<a[j].d<<endl;
                else cout<<a[j].d<<" "<<a[i].d<<endl;
            } 
        }
    }//输出
    return 0;//美丽好习惯
}

其实这道题字典序是个摆设但我还是写了。

完结撒花!

电砸三巨力逃走。