洛谷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;
}

浙公网安备 33010602011771号