题目大意:将一块木板切成n块,问你最小所需要的费用是多少。
算法思路:哈夫曼编码实现,这里特别要注意(不是算切完后木板的长度计算费用,而是在切之前计算费用)
,千万不要理解错题意,我就是因为理解错题意而想错了算法。
#include<iostream> #include<queue> #include<cstdio> #include<cstring> using namespace std; int t,v; long long sum,res; typedef struct Node { int v; bool operator < (const Node &node) const{ return node.v<v; } }; int main() { priority_queue<Node>que; scanf("%d",&t); res=0;sum=0; for(int i=0;i<t;i++) { Node node; scanf("%d",&v); node.v=v; que.push(node); sum+=v; } while(true) { int a1=que.top().v; que.pop(); int a2=que.top().v; que.pop(); sum+=(a1+a2); if(que.size()==1) break; else { Node node; node.v=a1+a2; que.push(node); } } printf("%lld\n",sum); return 0; }