专栏文章

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

P5741题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miox4l5i
此快照首次捕获于
2025/12/03 02:35
3 个月前
此快照最后确认于
2025/12/03 02:35
3 个月前
查看原文

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

题目传送门

分析题目,我们有两种选择,一种结构体,一种数组,显然结构体更简单易懂。所以我们先定义一个存放名字和语数英三科成绩的结构体。
CPP
struct stu{
	string e; //姓名
  int a; //语文
	int b; //数学
	int c; //英语
}q[1005];
接着看题,如果两对同学的每一科分差都不大于 55 分,且总分差不大于 1010 分,就是“旗鼓相当的对手”。所以我们先按字典序排序,再用双层循环来判断。
但我们并不用担心负数的情况,因为有 absabs 这个好东西。 可以取绝对值。
CPP
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; //如果是就输出
最后贴完整代码:
CPP
#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;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...