总之就是 | 排序杂题

数据排序 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]);
}

用了这个函数之后就真的极其简单

但是我之前不知道

因此整理下来

拼数

洛谷P1012 [NOIP 1998 提高组] 拼数

题目难度:普及-

收录原因:

就是单纯的想收进来

这题也不难

题目内容:

设有 n个正整数 a1…an,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。

题目分析:

在这里我的思路是用字符串来收取每个数

因为要得出一个最大的整数

那么就要高位越大的数放在前边

字符串比较只需要“<”和“>”就能完成这一工作

当然这个地方还是不能纯比较的

WonderfulAnswer的惨痛经历)

如果直接比较它会把位数大的看做大的

如果是321和32比较:

我们想要的是32,但是它判断的是321大

这样必然WA

在这里我们可以把要比较的两个字符串AB

这样来比较:
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数组这一回事了

就开了个结构体......实际上是一样的

攀爬者

洛谷P5143攀爬者

题目难度:普及/提高-

我这么简单就做出来的话,这可能连入门都算不上

收录原因:

这是我第一道毫不费力就做出来的黄体

题目内容:

(略有修改)

在地形图上标记了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

posted @ 2021-02-05 19:35  HerikoDeltana  阅读(192)  评论(0编辑  收藏  举报