10分,代码有注释,望dalao指教
查看原帖
10分,代码有注释,望dalao指教
1268524
DX3906_ourstar楼主2024/7/12 09:38

样例能过,但……

代码:

#include<iostream>
#include<queue>
#define int long long//个人习惯,龙龙于万物之中 
#define re register//听说用局部变量用register会快一点 
using namespace std;

int n,ans;
priority_queue<int,vector<int>,greater<int> > q;//一个小根堆 

signed main(){
//	freopen("P1090_2.in","r",stdin);
	cin>>n;
	for(re int i = 0;i < n;i ++){
		re int tmp;//用一个局部变量tmp存数目,省空间 
		cin>>tmp;
		q.push(tmp);
	}
	while(q.size() > 1){
		int a = q.top();//取堆顶 
		q.pop();//删除堆顶 
		int b = q.top();//取新堆顶,a、b分别代表堆中的第1、2个元素,即最小的两个数
		q.pop();
		//这是一种贪心策略,先合并数目小的果子种类 
		q.push(a + b);//已经合并完了,把结果扔进堆里进行下一轮合并 
		ans += q.top();//记录答案 
	}
	cout<<ans;
    return 0;
}

2024/7/12 09:38
加载中...