蓝桥杯真题:谈判

蓝桥杯真题:谈判_第1张图片 

输入输出样例

示例 1

输入

4
9 1 3 5

输出

31

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

这题思路很简单,如果是最小的代价和,一开始我的思路就是先排序,然后计算前缀和,然后把前缀和相加就好了。

但是这样其实有一个漏洞,那就是在计算前缀和的过程中其实也产生了新的代价的节点。如果新节点的代价又比后边的几个节点的代价高,那就出错了,不能简单地相加。

然后想到最小堆,每次选最小代价的两个节点相加再push进去,原来的两个小姐点就pop掉就好了。

代码如下所示:

#include 
using namespace std;
typedef long long ll;
int n,a;
int num[10001];
int ans;
priority_queue,greater> tree;

int main()
{
  // 请在此输入您的代码
  cin>>n;
  for(int i=0;i>a;
    tree.push(a);
  }
  if(tree.size()==1)
  {
    cout<1)
  {
    int x=tree.top();
    tree.pop();
    int y=tree.top();
    tree.pop();
    tree.push(x+y);
    ans+=x+y;
  }
  cout<

你可能感兴趣的:(排序,蓝桥杯,c++,学习)