题意:给出一段无限长的棍子,切一刀需要的代价是棍子的总长,例如21切一刀 变成什么长度 都是代价21 列如7切成5 和2 也是代价7
题解:可以利用霍夫曼编码的思想 短的棍子就放在底层 长的尽量切少一次 直接用优先队列 取前2个和一个然后代价加起来就好 有一个
小trick就是 只有一个棍子的时候要特判 还有sum要开Long long
#include<vector> #include<cstdio> #include<iostream> #include<queue> using namespace std; int main(){ int n; while(cin>>n){ priority_queue<int ,vector<int>,greater<int > >q; for(int i=0;i<n;i++){ int temp; scanf("%d",&temp); q.push(temp); } long long sum=0; if(q.size()==1){ cout<<q.top()<<endl; q.pop(); } while(q.size()>1){ int temp1=q.top();q.pop(); int temp2=q.top();q.pop(); sum+=temp1+temp2; q.push(temp1+temp2); } cout<<sum<<endl; } return 0; }