PAT 1125 Chain the Ropes

该博客介绍了如何通过优先队列优化算法,解决给定数列每次两两相加取其一半,最终得到最大向下取整整数的问题。博主详细解释了思路,即按数值大小排序并利用优先队列(最小堆)进行操作,避免大数过早减半导致损失。代码中展示了C++实现,包括如何定义最小堆以及使用数学函数`floor()`进行向下取整。

在这里插入图片描述
题目大意:
题中会给定一些数,每次两个数一相加就会变成一半,要得到最大的向下取整的整数。
思路:
如果是比较大的数在最开始就进行减半的话,损失很大,所以按照数据大小排列,每次取当时最小的两个数进行相加。
考虑了一系列容器后,最后我选择用优先队列来实现这个算法。
代码:

#include<iostream>
#include<queue>
#include<cmath>
using namespace std;
int main(){
	int n;
	cin>>n;
	priority_queue<double,vector<double>,greater<double>> pque;
	for(int i=0;i<n;i++){
		double s;
		cin>>s;
		pque.push(s);
	}
	int ans=0;
	while(pque.size()>=2){
		double a1,a2;
		a1=pque.top();
		pque.pop();
		a2=pque.top();
		pque.pop();
		pque.push((a1+a2)/2);
	}
	ans=(int)floor(pque.top());
	printf("%d",ans);
	return 0;
}

在这里插入图片描述
tips:

  • 优先队列头文件为queue,它默认是数最大排在最前面,如何更改优先级使数最小的排在前面:在定义的时候:priority_queue<typename,vector<typename,>,greater<typename,>> q;//尖括号里typename后的“,”其实不存在且不需要加,只是因为显示不出来我就用了这个符号。
    数最大的排在前面:
    priority_queue<typename,vector<typename,>,less<typename,>> q;
  • 一个常用的数学函数:
    floor(double x) 向下取整
    ceil(double x) 向上取整
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值