luogu1090(堆,排序,貪心)合併果子
阿新 • • 發佈:2019-01-22
每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過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; }