专栏文章
题解:P5741 【深基7.例10】旗鼓相当的对手 - 加强版
P5741题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miowzzub
- 此快照首次捕获于
- 2025/12/03 02:31 3 个月前
- 此快照最后确认于
- 2025/12/03 02:31 3 个月前
P5741 题解:
主要思路:
用变量存储每个学科分数的差 和总分的差 ,如果每个学科的分差 并且 ,则这两个学生就是旗鼓相当的对手,将这两个学生的名字存起来,最后按题目要求排序后再输出。
代码实现:
代码片段分析:
Part1 定义变量:
- 变量 :学生总数。
- 变量 :结构体 的长度。
- 结构体 :存储每个学生的信息。
- 结构体 :存储每对旗鼓相当的对手的名字。
int n;
int k=0;
struct stu{
string s;
int a,b,c,z;
}a[101000];
struct node{
string s,t;
}id[101000];
Part2 求分数差:
双层循环遍历 数组,变量 分别存储每科的分差, 存储总分分差。
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~)
CPPinline 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 条评论,欢迎与作者交流。
正在加载评论...