
题目大意:
题中会给定一些数,每次两个数一相加就会变成一半,要得到最大的向下取整的整数。
思路:
如果是比较大的数在最开始就进行减半的话,损失很大,所以按照数据大小排列,每次取当时最小的两个数进行相加。
考虑了一系列容器后,最后我选择用优先队列来实现这个算法。
代码:
#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) 向上取整
该博客介绍了如何通过优先队列优化算法,解决给定数列每次两两相加取其一半,最终得到最大向下取整整数的问题。博主详细解释了思路,即按数值大小排序并利用优先队列(最小堆)进行操作,避免大数过早减半导致损失。代码中展示了C++实现,包括如何定义最小堆以及使用数学函数`floor()`进行向下取整。
443

被折叠的 条评论
为什么被折叠?



