luogu1090(堆,排序,贪心)合并果子

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

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

我的思路:堆,排序+贪心

#include<iostream>
using namespace std;
int h[100000];
int size,sum,f1,f2;
void push(int data)
{
    size++;
    int i=size,pa;
    while (i>1)
    {
        pa=i/2;
        if (h[pa]<=data) break;
        h[i]=h[pa];
        i=pa;
    }
    h[i]=data;
}

int pop()
{
    int l,r,tmp=h[1],i=1,x=h[size];
    size--;
    while (i*2<=size)
    {
        l=i<<1;
        r=l+1;
        if (r<=size&&h[r]<h[l]) l=r;
        if (x<=h[l]) break;
        h[i]=h[l];
        i=l;
    }
    h[i]=x;
    return tmp;
}
int main()
{
    int n;
    cin>>n;
    int tmp;
    for (int i=1;i<=n;i++)
    {
        cin>>tmp;
        push(tmp);    
    }
    for (int i=1;i<=n-1;i++)
    {
        f1=pop();
        f2=pop();
        push(f1+f2);
        sum+=f1+f2;
    }
    cout<<sum;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章