蓝桥杯P7 sort排序算法练习

目录

1.浮点数排序 4.00

fabs函数求绝对值,round四舍五入

2.sort函数参数

3.红绿蓝穿手串

min函数嵌套就3个数最小值

4.整数排序进阶 17.00

5.成绩排序

用结构体捆绑成绩与标号然后输出 


1.浮点数排序 4.00

fabs函数求绝对值,round四舍五入

#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
double nums[105];
const double EPS = 1e-6;
bool cmp(double a, double b) {
	double da = fabs(a - round(a));//绝对值和四舍五入
	double db = fabs(b - round(b));
	if (fabs(da - db) < EPS)return a < b;//判断相等的情况
	else return da < db;

}
int main() {
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> nums[i];
	}
	sort(nums, nums + n, cmp);
	for (int i = 0; i < n; i++) {
		if (i != n - 1)
			printf("%lf ", nums[i]);
		else printf("%lf\n", nums[i]);
	}
	return 0;
}

2.sort函数参数

起始下标与结束下标后一位,分段排序用两次sort

3.红绿蓝穿手串

min函数嵌套就3个数最小值.

#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
int a, b, c;
int main() {
	string s;
	cin >> s;
	sort(s.begin(), s.end());
	cout << s << endl;
	int n = s.size();
	for (int i = 0; i < n; i++) {
		if (s[i] == 'R')a++;
		if (s[i] == 'G')b++;
		if (s[i] == 'B')c++;
	}
	cout << min(a, min(b / 2, c / 3));
	return 0;
}

4.整数排序进阶 17.00

#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
int xy(int a) {
	int sum = 0;
	while (a) {
		sum += a% 10;
		a = a / 10;
	}
	return sum;
}
bool cmp(int a, int b) {
	int aa = a, bb = b;
	int x = xy(a); int y = xy(b);
	if (x == y)return aa < bb;
	return x < y;
}
int nums[105];
int main() {
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> nums[i];
	}
	sort(nums, nums + n, cmp);
	for (int i = 0; i < n; i++) {
		cout << nums[i] << ' ';
	}
	
	return 0;
}

5.成绩排序 20.00

用结构体捆绑成绩与标号然后输出 

#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
struct student {
	int score;
	int id;
};
student nums[105];
bool cmp(student a,student b) {
	return a.score > b.score;
}
int main() {
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> nums[i].score;
		nums[i].id = i + 1;
	}
	sort(nums, nums + n, cmp);
	for (int i = 0; i < n; i++) {
		cout << nums[i].id << ' ';
	}
	
	return 0;
}

6.成绩排序升级 23.00

用strcmp函数使名字按照字典大小排序,或者用string直接比较大小

7.抢气球升级版 37.00

#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
struct student {
	int a;
	int id;
};
student child[1005];
int h[1005];
int ans[1005];
bool used[1005];
bool cmp(student a,student b) {
	return a.a < b.a;
}

int main() {
	int n,m;
	cin >> n>>m;
	for (int i = 0; i < n; i++) {
		cin >> child[i].a;
		child[i].id=i;
	}
	for (int i = 0; i < m; i++) {
		cin >> h[i];
	}
	
	sort(child, child + n, cmp);
	//升级版降低时间复杂度通过对高度也进行排序
	/*sort(h, h + m);
	int p = 0;
	for (int i = 0; i < n; i++) {
		while (p < m && h[p] <= child[i].a) {
			ans[child[i].id]++;
			p++;
		}
	}*/
	for(int i=0;i<n;i++)
		for (int j = 0; j < m; j++) {
			if (!used[j]&&h[j]<=child[i].a) {
				ans[child[i].id]++;
				used[j] = true;
			}
		}

	for (int i = 0; i < n; i++) {
		cout << ans[i] << endl;
	}
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值