洛谷题单算法1-2排序

发文章只是为了督促自己做题,双非大二刚转科班的菜菜一枚,代码仅供参考,不足之处望理解。

P2676 [USACO07DEC] Bookshelf

#include <iostream>
#include<algorithm>
#define ll long long
using namespace std;
bool cmp(ll a, ll b) {
	return a > b;
}
ll h[20005];
int main() {
	ll n = 0, b = 0, i = 0, sum = 0, cnt = 0;
	cin >> n >> b;
	for (i = 0; i < n; i++) {
		cin >> h[i];
	}
	sort(h, h + n, cmp);
	while (sum < b) {
		sum += h[cnt];
		cnt++;
	}
	cout << cnt << endl;
	return 0;
}

P1152 欢乐的跳

#include <iostream>
#include<algorithm>
#include<math.h>
#define ll long long
using namespace std;
ll a[1005];
ll b[1005];
bool cmp(ll a, ll b) {
	return a < b;
}
int main() {
	ll n = 0, flag = 0, i = 0;
	cin >> n;
	for (i = 0; i < n; i++) {
		cin >> a[i];
	}
	for (i = 0; i < n; i++) {
		b[i] = a[i + 1] - a[i];
		b[i] = abs(b[i]);
	}
	sort(b, b + n - 1, cmp);
	for (i = 0; i < n - 1; i++) {
		if (b[i] != i + 1) {
			flag = 1;
		}
	}
	if (flag == 0)
		cout << "Jolly" << endl;
	else
		cout << "Not jolly" << endl;
	return 0;
}

P1271 【深基9.例1】选举学生会

#include <iostream>
#include<algorithm>
#include<math.h>
#define ll long long
using namespace std;
ll a[2000005];
bool cmp(ll a, ll b) {
	return a < b;
}
int main() {
	ll n = 0, m = 0, i = 0;
	cin >> n >> m;
	for (i = 0; i < m; i++) {
		cin >> a[i];
	}
	sort(a, a + m, cmp);
	for (i = 0; i < m; i++) {
		cout << a[i]<<" ";
	}
	return 0;
}

P1177 【模板】排序

#include <iostream>
#include<algorithm>
#include<math.h>
#define ll long long
using namespace std;
ll a[100000005];
bool cmp(ll a, ll b) {
	return a < b;
}
int main() {
	ll m = 0, i = 0;
	cin >> m;
	for (i = 0; i < m; i++) {
		cin >> a[i];
	}
	sort(a, a + m, cmp);
	for (i = 0; i < m; i++) {
		cout << a[i]<<" ";
	}
	return 0;
}

P1923 【深基9.例4】求第 k 小的数

#include<iostream>
#include<algorithm>
#include<math.h>
#define ll long long
using namespace std;
ll a[5000005];
inline ll read() {				//快读
	char ch = getchar();
	int x = 0, f = 1;
	while (ch < '0' || ch>'9') {
		if (ch == '-') f = -1;
		ch = getchar();
	}
	while ('0' <= ch && ch <= '9') {
		x = x * 10 + ch - '0';
		ch = getchar();
	}
	return x * f;
}
int main() {
	ll m = 0, i = 0, k = 0 ;
	m = read();
	k = read();
	for (i = 0; i < m; i++) {
		a[i] = read();
	}
	sort(a, a + m);
	cout << a[k];
	return 0;
}

P1059 [NOIP2006 普及组] 明明的随机数

#include <iostream>
#include<algorithm>
#include<math.h>
#define ll long long
using namespace std;
ll a[105];
ll b[105];
int main() {
	ll n = 0, i = 0, j = 0, cnt = 0;
	cin >> n;
	for (i = 0; i < n; i++)
		cin >> a[i];
	sort(a, a + n);
	for (i = 0; i < n; i++)
		if (a[i] != a[i + 1])
			cnt++;
	cout << cnt << endl;
	for (i = 0; i < n; i++) {
		if (a[i] != a[i + 1]) {
			b[j] = a[i];
			j++;
		}
	}
	for (i = 0; i < cnt; i++)
		cout << b[i] << " ";
	return 0;
}

P1093 [NOIP2007 普及组] 奖学金

#include <iostream>
#include<algorithm>
#include<math.h>
#define ll long long
using namespace std;
struct student{
	int num,a,b,c,sum;
};
bool cmp(student x, student y) {
	if (x.sum > y.sum)
		return 1;
	else if (x.sum < y.sum)
		return 0;
	else {
		if (x.a > y.a) {
			return 1;
		}
		else if (x.a < y.a) {
			return 0;
		}
		else {
			return x.num < y.num;
		}
	}
}
student stu[305];
int main() {
	ll n = 0, i = 0, j = 0, cnt = 0;
	cin >> n;
	for (i = 0; i < n; i++) {
		cin >> stu[i].a >> stu[i].b >> stu[i].c;
		stu[i].sum = stu[i].a + stu[i].b + stu[i].c;
		stu[i].num = i + 1;
	}
	sort(stu, stu + n, cmp);
	for (i = 0; i < 5; i++) {
		cout << stu[i].num << " " << stu[i].sum << endl;
	}
	return 0;
}

P1781 宇宙总统

#include <iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct person{
	int num,len;
	string str;
};
person per[25];
bool cmp(person x, person y) {
	if (x.len > y.len)
		return 1;
	if (x.len == y.len && x.str > y.str)
		return 1;
	return 0;
}
int main() {
	int n = 0, i, j;
	cin >> n;
	for (i = 0; i < n; i++) {
		cin >> per[i].str;
		per[i].num = i + 1;
		per[i].len = per[i].str.length();
	}
	sort(per, per + n, cmp);
	cout << per[0].num << endl;
	cout << per[0].str << endl;
	return 0;
}

P1116 车厢重组

#include <iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int a[10005];
int main() {
	int n, i, j, cnt = 0;
	cin >> n;
	for (i = 0; i < n; i++) {
		cin >> a[i];
	}
	for (i = 0; i < n - 1; i++) {
		for (j = 0; j < n - 1 - i; j++) {
			if (a[j] > a[j + 1]) {
				int t = a[j];
				a[j] = a[j + 1];
				a[j + 1] = t;
				cnt++;
			}
		}
	}
	cout << cnt << endl;
	return 0;
}

P1068 [NOIP2009 普及组] 分数线划定

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct person {
	int k, s;
};
person per[5005] = { 0 };
bool cmp(person x, person y) {
	if (x.s > y.s)
		return 1;
	if (x.s == y.s && x.k < y.k)
		return 1;
	return 0;
}
int main() {
	int n, m, i, j, cnt = 0;
	cin >> n >> m;
	for (i = 0; i < n; i++) {
		cin >> per[i].k >> per[i].s;
	}
	m = m * 1.5 - 1;
	sort(per, per + n, cmp);
	int t = per[m].s;
	for (i = 0; i < n; i++) {
		if (per[i].s >= t)
			cnt++;
	}
	cout << t << " " << cnt << endl;
	for (i = 0;; i++) {
		if (per[i].s >= t)
			cout << per[i].k << " " << per[i].s << endl;
		else
			break;
	}
	return 0;
}

P5143 攀爬者

#include<iostream>
#include<algorithm>
#include<math.h>
#include<cstring>
using namespace std;
struct point {
	int x, y, z;
};
point p[50005];
bool cmp(point a, point b) {
	return a.z < b.z;
}
double length(point a, point b) {
	return sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2) + pow(a.z - b.z, 2));
}
int main() {
	int n, i, j; double sum = 0.0;
	cin >> n;
	for (i = 0; i < n; i++) {
		cin >> p[i].x >> p[i].y >> p[i].z;
	}
	sort(p, p + n, cmp);
	for (i = 1; i < n; i++) {
		double t = length(p[i - 1], p[i]);
		sum += t;
	}
	printf("%.3lf", sum);
}

P1104 生日

#include<iostream>
#include<algorithm>
#include<math.h>
#include<cstring>
using namespace std;
struct student {
	string s; int y, m, d, id;
};
student stu[105];
bool cmp(student x, student y) {
	if (x.y < y.y)
		return 1;
	else if (x.y > y.y)
		return 0;
	else {
		if (x.m < y.m)
			return 1;
		else if (x.m > y.m)
			return 0;
		else {
			if (x.d < y.d)
				return 1;
			else if (x.d > y.d)
				return 0;
			else {
				return x.id > y.id;
			}
		}
	}
}
int main() {
	int n, i;	cin >> n;
	for (i = 0; i < n; i++) {
		cin >> stu[i].s >> stu[i].y >> stu[i].m >> stu[i].d;
		stu[i].id = i;
	}
	sort(stu, stu + n, cmp);
	for (i = 0; i < n; i++)
		cout << stu[i].s << endl;
	return 0;
}

P1012 [NOIP1998 提高组] 拼数

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
bool cmp(string a, string b) {
	return a + b > b + a;
}
string a[25];
int main() {
	int n, i; 
	cin >> n;
	for (i = 0; i < n; i++)
		cin >> a[i];
	sort(a, a + n, cmp);
	for (i = 0; i < n; i++)
		cout << a[i];
	return 0;
}

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 算法10-12~10-14是关于归并排序的。 归并排序是一种基于分治思想的排序算法,它将待排序的序列分成两个子序列,对每个子序列进行排序,然后将两个已排序的子序列合并成一个有序序列。 算法10-12是归并排序的递归实现,它将待排序的序列不断地分成两个子序列,直到每个子序列只有一个元素,然后将这些子序列两两合并,直到最终得到一个有序序列。 算法10-13是归并排序的非递归实现,它使用迭代的方式将待排序的序列分成若干个子序列,然后将相邻的子序列两两合并,直到最终得到一个有序序列。 算法10-14是归并排序的优化实现,它使用插入排序来处理长度较小的子序列,以提高排序效率。具体来说,当子序列的长度小于等于一定阈值时,使用插入排序排序,否则使用归并排序排序。 ### 回答2: 归并排序是一种基于分治思想的排序算法。该算法的核心思想是将待排序的序列不断分割成更小的子序列,直到每个子序列只有一个元素,然后将这些子序列逐一合并,直到整个序列有序。因此,归并排序分为两个主要过程,分别是分割过程和合并过程。 分割过程:归并排序首先将待排序的序列均分成两个子序列,然后递归地对子序列进行分割,直到每个子序列只有一个元素。 合并过程:将两个有序的子序列合并成一个有序的序列。此时需要定义两个指针 i 和 j 分别指向两个子序列的起始位置,比较两个指针所指向的元素的大小,将较小的元素放到结果数组中并将指针向后移动,直到有一个子序列的指针到达了序列的末尾,然后将另一个子序列中未处理的元素依次放入结果数组中。 归并排序的时间复杂度为 O(N*logN),其中 N 为序列的长度。因此,归并排序是一种性能较好且稳定的排序算法,但由于其需要使用临时数组来辅助排序,因此空间复杂度为 O(N)。 总之,归并排序是一种高效且稳定的排序算法,适用于各种规模的序列。在实际应用中,可以使用多线程或并发编程来加速归并排序的执行过程,提高排序效率。 ### 回答3: 归并排序是一种常见的排序算法,采用了分治的思想,可以在最坏情况下也达到O(nlogn)的时间复杂度。它将一个大问题拆分成小问题,然后逐个解决小问题。下面是归并排序的基本流程: 1. 将待排序的序列按照中间位置分为两个子序列,分别排序。 2. 合并两个有序的子序列,形成一个新的有序序列。 具体实现时,我们可以使用递归或迭代两种方式。下面以递归方式来说明归并排序的实现。 算法10-12:递归实现归并排序 1. 将序列按中间位置分为左右两个子序列。 2. 对左右子序列分别递归调用归并排序。 3. 合并左右子序列。 算法10-13:合并两个有序序列 1. 定义一个新序列,长度为左右子序列之和。 2. 从两个子序列的头开始比较,将小的元素放入新序列中。 3. 将剩余的元素全部复制到新序列中。 算法10-14:归并排序时间复杂度 1. 分解阶段:将序列分为两个子序列,时间复杂度为O(logn)。 2. 合并阶段:合并两个有序序列,时间复杂度为O(n)。 3. 总时间复杂度为O(nlogn)。 归并排序虽然时间复杂度较低,但空间复杂度为O(n),需要额外的存储空间来存储临时序列。但相比其他排序算法,归并排序具有稳定性,适合处理大规模数据的排序

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值