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

请同学们在看完重点知识之后先自己思考再看代码,建议先自己尝试,不行再看参考代码

基础知识1:结构体
基础代码
定义结构体的基本格式:
struct 结构体名{
    成员变量类型 成员变量名称
    成员函数,这一部分可写可不写
}xxxx; //xxxx处可以申请结构体变量
例如:

struct Person{
    string name; //string和char数组相似
    int score;
    void print(){//这部分可写可不写
        cout<<name<<" : "<<score<<endl;
    }
};
如何使用
基础知识2:函数
1.函数的基本结构:
函数类型 函数名(参数列表){
函数主体,函数在return语句终止,void类型的函数可以不return,也可以写"return ;"这么一句话
}

2.函数的调用:
函数名(参数)进行使用,参数和参数列表对应
程序基本思路或小技巧:双重循环枚举规避重复数对
程序基本思路:
 两层循环遍历所有的数对(i,j)
 首先确定规则i<j,然后对每个i去枚举(i+1,n)中的所有的数
 因此可写作:
 for(int i = 1; i <= n; ++i){
    for(int j = i + 1; j <= n; ++j){
        对(i,j)进行的操作
    }
 }
 可以当作一个技巧
代码展示
#include<bits/stdc++.h>
using namespace std;
//定义结构体名stu
struct stu{
    //成员变量 string name学生姓名,int val1,val2,val3三门成绩,int sum总分数
    string name;
    int val1, val2, val3;
    int sum;
}Stu[1000 + 7];//定义结构体数组Stu[1000+7](注意S是大写的)
//定义判断函数j1,用来判断一门课是不是分差在5分以内
//函数类型:bool 函数名:j1 参数列表(int val1, int val2)
bool j1(int val1,int val2){//val1和val2分别表示两个人的分数
    if(fabs(val1 - val2) <= 5) return true; // 分差的绝对值小于5,势均力敌
    else return false;//否则不势均力敌
}
//定义判断函数j2,用来判断总分是不是分差在10分以内
//函数类型:bool 函数名:j2 参数列表(int val1, int val2)
bool j2(int val1, int val2){//val1和val2分别代表两个人的总分
    if(fabs(val1 - val2) <= 10) return true;//分差的绝对值小于10,势均力敌
    else return false;//否则不势均力敌
}
int main()
{
    int n; scanf("%d",&n);
    for(int i = 1; i <= n; ++i){
        //输入学生的信息
        cin>>Stu[i].name>>Stu[i].val1>>Stu[i].val2>>Stu[i].val3;
        //计算学生的总分
        Stu[i].sum = Stu[i].val1 + Stu[i].val2 + Stu[i].val3;
    }
    //使用两层循环去枚举(i,j)
    for(int i = 1; i <= n; ++i){
        //注意j从i+1开始
        for(int j = i + 1; j <= n; ++j){
            //调用函数看两个学生i和j是否满足条件
            if(j1(Stu[i].val1,Stu[j].val1) && j1(Stu[i].val2,Stu[j].val2) && j1(Stu[i].val3,Stu[j].val3) && j2(Stu[i].sum,Stu[j].sum))
                cout<<Stu[i].name<<" "<<Stu[j].name<<endl;
        }
    }
    return 0;
}
posted @ 2022-05-02 22:13  a_night  阅读(707)  评论(0)    收藏  举报