专栏文章

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

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

文章操作

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

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

P5741 题解:

主要思路:

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

代码实现:

代码片段分析:

Part1 定义变量:

  • 变量 nn:学生总数。
  • 变量 kk:结构体 idid 的长度。
  • 结构体 aa:存储每个学生的信息。
  • 结构体 idid:存储每对旗鼓相当的对手的名字。
CPP
int n;
int k=0;
struct stu{
	string s;
	int a,b,c,z;
}a[101000];
struct node{
	string s,t;
}id[101000];

Part2 求分数差:

双层循环遍历 aa 数组,变量 a1,b1,c1a1,b1,c1 分别存储每科的分差,z1z1 存储总分分差。
CPP
	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~)
CPP
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 勿喷。~
CPP
#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;
}
~求过~

评论

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

正在加载评论...