1. 程式人生 > >luogu1090(堆,排序,貪心)合併果子

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;
}