nyoj 55(优先队列)
生活随笔
收集整理的這篇文章主要介紹了
nyoj 55(优先队列)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
懶省事的小明
時間限制:3000?ms ?|? 內存限制:65535?KB 難度:3 描述每一次合并,小明可以把兩堆果子合并到一起,消耗的體力等于兩堆果子的重量之和。可以看出,所有的果子經過n-1次合并之后,就只剩下一堆了。小明在合并果子時總共消耗的體力等于每次合并所耗體力之和。?
因為還要花大力氣把這些果子搬回家,所以小明在合并果子時要盡可能地節省體力。假定每個果子重量都為1,并且已知果子的種類數和每種果子的數目,你的任務是設計出合并的次序方案,使小明耗費的體力最少,并輸出這個最小的體力耗費值。?
例如有3種果子,數目依次為1,2,9??梢韵葘?、2堆合并,新堆數目為3,耗費體力為3。接著,將新堆與原先的第三堆合并,又得到新的堆,數目為12,耗費體力為12。所以小明總共耗費體力=3+12=15??梢宰C明15為最小的體力耗費值。 輸入
15
解題思路:這道題目就是用哈夫曼編碼的思想,用優先隊列即可。。。注意如果是priority_queue<int> 默認的是從大到小,所以要是從小到大,就應該用priority_queue<int,vector<int>,greater<int>>。。。
AC:
AC:
#include<iostream> #include<cstring> #include<functional> #include<queue> using namespace std;priority_queue<int,vector<int>,greater<int>> que; int n;int main() {int t,a,ans;cin>>t;while(t--){ans = 0;cin>>n;for(int i = 1; i <= n; i++){cin>>a;que.push(a);}while(true){int fst = que.top();que.pop();if(que.empty()){cout<<ans<<endl;break;}int scd = que.top();que.pop();int sum = fst + scd;ans += sum;que.push(sum);}}return 0; }
總結
以上是生活随笔為你收集整理的nyoj 55(优先队列)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STL 整理(map、set、vecto
- 下一篇: nyoj 586