经常有点小迷糊 2021-08-27 22:41 采纳率: 96.7%
浏览 62
已结题

这道题出了什么错,该怎么改?


在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。

每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所消耗体力之和。

因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。

例如有3种果子,数目依次为129。可以先将12堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以多多总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。

 

【输入文件】

 

输入文件fruit.in包括两行, 第一行是一个整数n(1<=n<=10000),表示果子的种类数。第二行包含n个整数,用空格分隔,第i个ai(1<=ai<=20000)是第i个果子的数目。

 

【输出文件】

 

输出文件fruit.out包括一行,这一行只包含一个整数,也就是最小的体力耗费值。输入数据保证这个值小于231。

 

【样例输入】

 

3

1 2 9

 

【样例输出】

 

15

 

【数据规模】

 

对于30%的数据,保证有n<=1000;

对于50%的数据,保证有n<=5000;

对于全部的数据,保证有n<=10000
#include <bits/stdc++.h>
using namespace std;
int main() {
    priority_queue <int> ans;
    int n;
    cin >> n;
    int w[n];
    long long k = 0;
    for (int i = 1; i <= n; i++) {
        cin >> w[i];
        ans.push(w[i]);
    }
    for (int i = 1; i <= n; i++) {
        int x = ans.top();
        ans.pop();
        int y = ans.top();
        if (i == 1) {
            ans.push(x + y);
            k = x + y;
        } else {
            ans.push(k + y);
            k = k + y;
        }
    }
    cout << k << endl;
    return 0;
}

  • 写回答

1条回答 默认 最新

报告相同问题?

问题事件

  • 系统已结题 9月12日
  • 已采纳回答 9月4日
  • 创建了问题 8月27日

悬赏问题

  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 unity第一人称射击小游戏,有demo,在原脚本的基础上进行修改以达到要求
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line