搜索
热搜: NOIP OIer 神牛
查看: 306|回复: 0

1375

[复制链接]

主题

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2023-4-9 09:13:32 | 显示全部楼层 |阅读模式
题目大意:
用一堆桃子和另一堆桃子合并,用合并的桃子再用另一堆桃子合并,直到只剩一堆桃子


明显的,体力等于两堆桃子之和,所以我们经过简单的推理得到
优先合并桃子少的,体力之和最少。

有了策略,我们就可以开始写代码了。
打住!!
n是30000,你用冒泡的n方的时间复杂度会超限。
sort的话,经过简单的计算,很明显超限。


分析一下我们的过程:
1.取出两个最少的桃子堆
2.合并成一个放回去
3.重新排序,返回第一步,直到只剩一堆


那么,能够轻松取出和推入元素的,并且能轻松排序的是


优先队列!!!


上代码!
  • #include<iostream>
  • #include<cstdio>
  • #include<string.h>
  • #include<algorithm>
  • #include<cmath>
  • #include<queue>
  • using namespace std;
  • priority_queue<long long,vector<long long>,greater<long long> > q;
  • //一定都要写long long
  • int arr[30000];
  • int n;
  • int main()
  • {
  •         int i,j,m;
  •         int a,b;
  •         long long sum=0;
  •         cin>>n;
  •         for (i=1;i<=n;i++)
  •         {
  •                 scanf("%d",&m);
  •                 //要写scanf,节省时间
  •                 arr=m;
  •                 q.push(m);
  •         }
  •         while(q.size()>1)
  •         {
  •                 a=q.top();
  •                 q.pop();
  •                 b=q.top();
  •                 q.pop();
  •                 q.push(a+b);
  •                 //取出两堆,合并后放回
  •                 sum+=a+b;
  •         }
  •         cout<<sum<<endl;
  •         return 0;
  • }


[color=rgb(51, 102, 153) !important]复制代码


求评价!!!







回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

津ICP备19006949号-1 | 津公网安备12010102000465号

快速回复 返回顶部 返回列表