总之就是 | 排序杂题
数据排序 Part Two
修改:2021.2.6 统一了题解题目格式(虽然这个好像有点不一样)
更新:2021.2.5 将原文中“看似男考虑”改为”看似难考虑”
这里会不定期的收集我觉得有必要整理一下的数据排序题
已经不再更新了。
这篇题解和之前的风格略有变化
求第K小的数
题目难度:入门(假如不用nth_element,为普及/提高-)
收录原因:
STL 库函数:nth_element
函数使用方法:
nth_element(x,x+k,x+n);
其中:
x是数组名k是要求的第k小的元素
n是元素个数
函数用途:
主要用来将数组元素中第k小的整数排出来并在数组中就位
随时调用,十分实用
题目内容
求n个数字中第k小的数字
代码实现
#include<bits/stdc++.h>//万能头文件
using namespace std;
int x[5000005],k;
int main()
{
int n;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
scanf("%d",&x[i]);
nth_element(x,x+k,x+n);
printf("%d",x[k]);
}
用了这个函数之后就真的极其简单
但是我之前不知道
因此整理下来
拼数
题目难度:普及-
收录原因:
就是单纯的想收进来
这题也不难
题目内容:
设有 n个正整数 a1…an,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。
题目分析:
在这里我的思路是用字符串来收取每个数
因为要得出一个最大的整数
那么就要高位越大的数放在前边
而字符串比较只需要“<”和“>”就能完成这一工作
当然这个地方还是不能纯比较的
(WonderfulAnswer的惨痛经历)
如果直接比较它会把位数大的看做大的
如果是321和32比较:
我们想要的是32,但是它判断的是321大
这样必然WA
在这里我们可以把要比较的两个字符串A和B
这样来比较:
a+b>b+a
这样的话就可以避免字符串本身关系运算带来的问题
代码实现:
#include <iostream>
#include <algorithm>
using namespace std;
struct Aqua
{
string a;
};
Aqua Mea[21];//Aqua Mea 贴贴(误)
int cmp(Aqua x,Aqua y)
{
return x.a+y.a>y.a+x.a;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>Mea[i].a;
}
sort(Mea+1,Mea+1+n,cmp);
for(int i=1;i<=n;i++)
cout<<Mea[i].a;
cout<<endl;
return 0;
}
当然这里有个问题就是我忘了string数组这一回事了
就开了个结构体......实际上是一样的
攀爬者
题目难度:普及/提高-
我这么简单就做出来的话,这可能连入门都算不上
收录原因:
这是我第一道毫不费力就做出来的黄体
题目内容:
(略有修改)
在地形图上标记了N个点,每个点Pi都有一个坐标(xi,yi,zi)。
所有点对中,高度值z不会相等。
某蒟蒻准备从最低的点爬到最高的点,他的攀爬满足以下条件:
(1) 经过他标记的每一个点;
(2) 从第二个点开始,他经过的每一个点高度z都比上一个点高;
(3) 蒟蒻会飞
他从一个点 Pi 爬到 Pj 的距离为两个点的欧几里得距离。
即,
Pi 和 Pj 各坐标差的平方的和 再开方
现在,蒟蒻希望你能求出他攀爬的总距离。
题目分析:
实际上原题是给了公式的具体形式的
我不想粘图片,就用文字叙述了
这个题套上公式就不用说了
再来看其他要求:
经过每一个标记点,每次的高度都比上次的高度大
看似难考虑
但是
原题中说到z坐标不相同,所以只需要按照z坐标排序就好了
排序函数大约就是这样:
int cmp(Nana a,Nana b)
{
return (a.z<b.z);
}
最后要注意一下要输出三位小数
那么这个题就分析完了......
代码实现:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
using namespace std;
struct Nana
{
double x,y,z;
};
Nana Dio[50001];
int n;
double sum;
int cmp(Nana a,Nana b)
{
return (a.z<b.z);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>Dio[i].x>>Dio[i].y>>Dio[i].z;
}
sort(Dio+1,Dio+1+n,cmp);
for(int i=1;i<=n-1;i++)
{
sum+=sqrt((Dio[i].x-Dio[i+1].x)*(Dio[i].x-Dio[i+1].x)
+(Dio[i].y-Dio[i+1].y)*(Dio[i].y-Dio[i+1].y)
+(Dio[i].z-Dio[i+1].z)*(Dio[i].z-Dio[i+1].z));
}
printf("%.3lf",sum);
return 0;
}
End
2021.2.5
字数1172