题解:P5741 【深基7.例10】旗鼓相当的对手 - 加强版
P5741 题解:
简单版题目传送门
加强版题目传送门
主要思路:
用变量存储每个学科分数的差
代码实现:
代码片段分析:
Part1 定义变量:
- 变量
n :学生总数。 - 变量
k :结构体id 的长度。 - 结构体
a :存储每个学生的信息。 - 结构体
id :存储每对旗鼓相当的对手的名字。
int n;
int k=0;
struct stu{
string s;
int a,b,c,z;
}a[101000];
struct node{
string s,t;
}id[101000];
Part2 求分数差:
双层循环遍历
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~)
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 勿喷。~
#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;
}
~求过~