P1090 [NOIP2004 提高组] 合并果子

https://www.luogu.com.cn/problem/P1090
贪心,二叉堆,优先队列
黄色题
 
思路:
大致思路也就是,先找到两个最小的,取出来,相加再放进去,但如果每次取之前都进行一次排序的话就会超时,所以不排序直接找到最小的和次小的。
复制代码
#include<bits/stdc++.h> using namespace std; int n,a[10005],sum; void pd(int x) { int p=x; for(int i=p+1; i<=n; i++) { if(a[p]>a[i]) { p=i; } } swap(a[x],a[p]); } int main() { cin>>n; for(int i=1; i<=n; i++) { cin>>a[i]; } pd(1); pd(2); for(int i=2; i<=n; i++) { a[i]+=a[i-1]; sum+=a[i]; pd(i); pd(i+1); } cout<<sum; return 0; }
复制代码

写法二:优先队列

复制代码
#include<stdio.h> #include<queue> #include<string.h> #include<algorithm> using namespace std; struct node { int m; bool operator<(const node &a) const//优先队列,重量小的在前 { return a.m<m; } }; int main() { int i,j,n,sum; priority_queue<node>Q; node p,q; while(~scanf("%d",&n)) { for(i=0; i<n; i++) { scanf("%d",&p.m); Q.push(p); } sum=0; for(i=0;i<n-1;i++)//n个果子只需要n-1次合并 { p=Q.top(),Q.pop(); q=Q.top(),Q.pop(); sum+=p.m+q.m; p.m=p.m+q.m; Q.push(p); } while(!Q.empty()) Q.pop(); printf("%d\n",sum); } return 0; }
复制代码

 


__EOF__

本文作者灰の魔女伊蕾娜
本文链接https://www.cnblogs.com/2elaina/p/16564730.html
关于博主:编程小萌新一名,希望从今天开始慢慢提高,一步步走向技术的高峰!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   -イレイナ  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示