排序+去重
去重的思路:
- 创建一个bool数组,用于打标签。如果数字num已出现,则在bool数组的num位置上标记1
- 如果num是第一次标记,则将其插入到int数组中
- 如果num已经标记过了,即是重复数字,则跳过此次插入
排序思路:利用c++中的sort函数,具体用法可以查找下相关资料
例题1:

奉上代码:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
using namespace std;
int a1[1001];
bool a2[1001];//创建一个bool数组用于打标签
int main()
{
int N = 0,tmp = 0,num = 0;
cin >> N;
for (int i = 0; i < N; i++) {
cin >> tmp;
if (a2[tmp] == 1)
{
continue;
}
a2[tmp] = 1;
a1[num] = tmp;
num++;
}
sort(a1, a1 + num);
cout << num << endl;
for (int i = 0; i < num; i++) {
cout << a1[i] << " ";
}
return 0;
}
例题2:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
using namespace std;
long long int arr1[100000100];//这些是看过评测数据的,有这么大
//把差放进bool数组中,遍历[1,n−1] 之间的所有整数,判断是否满足
bool arr2[100000100];
int main() {
long long int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> arr1[i];
}
for (int i = 0; i < n - 1; i++)
{
arr2[abs(arr1[i + 1] - arr1[i])] = 1;//差值出现过,则赋值1
}
for (int i = 1; i <= n-1; i++) {
if (arr2[i] == 0) {
cout<<"Not jolly";
return 0;
}
}
cout << "Jolly";
return 0;
}
自定义排序
附上我参考的博客:C++中的sort自定义排序函数_c++ sort自定义排序-优快云博客
总而言之,sort函数有三个参数,`sort(first,last,cmp)`。
其中,cmp函数在默认情况下是从小到大排序,如果我们要改变默认情况(比如,从大到小,日期排序等等),则需要重载cmp函数
例题:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
using namespace std;
struct node {
string name;
int year, month, day;
int num;//记录的顺序,如果有两个同学生日相同,顺序靠后的同学先输出
}nd[101];
//重载cmp函数
bool cmp(node a, node b) {
if (a.year != b.year) {
return a.year < b.year;
}
else {//如果年份相等,比较月份
if (a.month != b.month)
{
return a.month < b.month;
}
else
{//如果月份相等比较天数
if (a.day != b.day) {
return a.day < b.day;
}
else
{
return a.num > b.num;//如果有两个同学生日相同,顺序靠后的同学先输出
}
}
}
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> nd[i].name >> nd[i].year >> nd[i].month >> nd[i].day;
nd[i].num = i;
}
//这里注意,要选择稳定排序,不然会发生名字和日期错位的情况
stable_sort(nd, nd + n, cmp);
for (int i = 0; i < n; i++)
cout << nd[i].name << endl;
return 0;
}
176万+

被折叠的 条评论
为什么被折叠?



