【BZOJ】1666 [Usaco2006 Oct]Another Cow Number Game 奶牛的数字游戏
【算法】贪心&&堆
【题解】反过来看就是合并任意两块木板,花费为木板长度之和。
显然从最小的两块开始合并即可,用堆(优先队列)维护。
经典DP问题石子归并是只能合并相邻两堆石子,所以不能贪心。
手写堆版本见http://www.cnblogs.com/onioncyc/p/6212840.html
#include<cstdio> #include<algorithm> #include<queue> using namespace std; priority_queue<int,vector<int>,greater<int> >q; const int maxn=20010; int n; long long ans; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { int u; scanf("%d",&u); q.push(u); } for(int i=1;i<n;i++) { int A=q.top();q.pop(); int B=q.top();q.pop(); ans+=A+B;q.push(A+B); } printf("%lld",ans); return 0; }