首页 > 代码库 > 【贪心】合并果子
【贪心】合并果子
这是一道非常经常的贪心问题。
题目所遵循的原则就是 把最小的两个元素合并的话 体力消耗最少(抱歉 我不会证明 )
之后的话用优先队列读入所有数(得重载运算符从小到大排),之后每次把队首的元素取出来和后一个元素合并。合并完后再扔进队列,循环n-1次。直到只剩下一堆时
#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;priority_queue<int,vector<int>,greater<int> >Q; //创建优先对列 greater<int>就是让该队列自动从小(队头)到大(队尾)排序,若改作less<int>则是从大(队头)到小(队尾)。int N,x,ans=0,tmp=0;int main(){ cin>>N; for(int i=1;i<=N;i++) { cin>>x; Q.push(x); //将果子数入队 它将自动排序 } for(int i=1;i<=N-1;i++) { tmp=Q.top(); //读取当前最小的一堆 Q.pop(); tmp=tmp+Q.top(); //读取当前第二小的一堆与最小的一堆合并 Q.pop(); Q.push(tmp); //将刚刚合并的两堆重新入队,让它再次排序 ans=ans+tmp; //统计所用的能量 } cout<<ans; return 0;}
【贪心】合并果子
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。