涉及知识点:
1.重载运算符的知识
2.sort函数的使用
3.高精度排序
sort函数的用法?
通过面向百度GOOGLE编程的我,得知,sort的用法
sort函数详解(史上最完整QAQ) - AlvinZH - 博客园
对于数组而言,sort语法结构为 sort(数组名,数组名+数组长度)//可以有第三个参数,为比较函数,一般来说都是要做一个比较函数的。
对于vector容器而言,sort语法结构为 sort (迭代器.begin(),迭代器.end())//可以有第三个参数
重载运算符有什么用?
可以扩充各种操作符,更方便运用和避免部分复杂语法。
在本篇文章中重载小于号,使比较操作放在结构体内进行,相比于比较函数,更加节省时间,访问速度更快
语法结构为 bool operator 需要重载的符号 (形参列表){ to do }
bool operator <(const people &orter)const{return z < orter.z
}
例题1:洛谷算法1-2 P5143 攀岩者
传送门:攀爬者 - 洛谷
思路 ,根据题目的意思,先要将输入的数据进行一个关于高度成员的排序,此时有两种思路,1.sort ,做一个比较函数来比较结构体成员大小;
2.sort,利用重载技术,重载小于号符号,使比较在结构体内部进行。
上题解:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
#define MAX 5000
struct Node {double x, y, z;bool operator <(const Node& other)const {return z < other.z;//高度逐渐增高/}
}NodeXYZ[MAX];
int main()
{int n;cin >> n;for (int i = 0; i < n; i++) {scanf("%lf%lf%lf", &NodeXYZ[i].x, &NodeXYZ[i].y, &NodeXYZ[i].z);}sort(NodeXYZ, NodeXYZ + n);//根据高度从小到大排序。这里对小于号重载,sort排序在结构体内部进行,节省时间double distance = 0;double cx = NodeXYZ[0].x, cy = NodeXYZ[0].y, cz = NodeXYZ[0].z;for (int i = 0; i < n; i++) {distance += sqrt(abs(cx - NodeXYZ[i].x) * abs(cx - NodeXYZ[i].x) + abs(cy - NodeXYZ[i].y) * abs(cy - NodeXYZ[i].y) + abs(cz - NodeXYZ[i].z) * abs(cz - NodeXYZ[i].z));//两点的欧几里得距离cx = NodeXYZ[i].x;cy = NodeXYZ[i].y;cz = NodeXYZ[i].z;}printf("%.3lf\n", distance);
}
什么是高精度排序?
高精度排序,有多种表示方式,有用数组的,也可以用string做成字符串。本次使用后者
我们知道,编译器无法去接受特别大的数,如9999!这时候就要利用的高精度的知识。
通过将一大串数字转化成字符串的思想(或者把几个数字存在数组的一个位置中,也被称压缩高精度)就可以实现编译器的读写。
例题2: 洛谷算法1-2 P1781 宇宙总统
传送门:宇宙总统 - 洛谷
思路 数据过大,这时候就要考虑高精度的排序方法,先做一个string类型的变量,for循环连续输入string变量。再去比较这几个数的长度:
1.如果长度不一,大的作为max。
2.如果长度相同,比较值的大小。
上题解:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#include<string>int main() {string max = " ";//一开始把max定义i成空格,后续进行比较,大的就替换string in;int n,id;//id是记录最多人的编号cin >> n;for (int i = 1; i <= n; i++) {cin >> in;int inSize = in.size();int maxSize = max.size();if (inSize > maxSize || (inSize >= maxSize && in > max)) {max = in;id = i;}}cout << id << endl << max;
}
最后来一道真正需要用到结构体成员排序的题
例题3: 洛谷算法1-2 P1093 奖学金
传送门:[NOIP2007 普及组] 奖学金 - 洛谷
题解:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#define MAX 500
#include<algorithm>struct people {int chinese;int english;int math;int sum;int num;//编号
}students[MAX];
//比较函数一般自己构造。结构体部分元素的排序通过sort的比较函数部分实现。
bool compare(people s1, people s2)
{if (s1.sum > s2.sum) return 1;else if (s1.sum < s2.sum) return 0;else{if (s1.chinese > s2.chinese) return 1;else if (s1.chinese < s2.chinese) return 0;else{if (s1.num > s2.num) return 0;else return 1;}}
}
int main() {int n;cin >> n;for (int i = 1; i <= n; i++) {students[i].num = i;cin >> students[i].chinese >> students[i].english >> students[i].math;students[i].sum = students[i].chinese + students[i].english + students[i].math;}sort(students+1, students+1 + n, compare);for (int i = 1; i <= n ; i++)cout << students[i].num << " " << students[i].sum << endl;
}
这里我一开始错了,语法错误是people成员未定义,仔细排查才知道,原来是把比较函数放在结构体前面了,导致people成员未定义
今天的文章就分享到这,编程小白,知识掌握尚浅,若有出入和漏洞,希望大佬们能提点一二。