NYOJ 55 懒省事的小明 (优先队列)

2015-01-22 20:59:06 · 作者: · 浏览: 3

题目意思:

?

每一次合并,小明可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。小明在合并果子时总共消耗的体力等于每次合并所耗体力之和。

  因为还要花大力气把这些果子搬回家,所以小明在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使小明耗费的体力最少,并输出这个最小的体力耗费值。
  例如有3种果子,数目依次为1,2,9。可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以小明总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。
输入第一行输入整数N(0 每组测试数据输出包括一行,这一行只包含一个整数,也就是最小的体力耗费值。样例输入
1
3 
1 2 9
样例输出
15

题目分析:

要是消耗的能力最小,每次选择最小的两堆放在一起,因此只需要定义个优先队列,使数小的值优先级高,每次取出两个队首进行合并放入到队列中,直到队列中剩下一个元素的时候结束,在先喝个过程中记录最小的消耗能量值。可以用STL中的priority_quque

?

AC代码:

?

/**
 *优先队列,
 */
#include
     
      
#include
      
        #include
        #include
        
          #include
         
           #include
          
            #include
           
             #include
            
              #include
             
               #include
              
                #include
               
                 #include
                
                  #include
                 
                   #define LL long long using namespace std; int main() { int t,n,x; priority_queue
                  
                   , greater
                   
                     > q;//定义小的数优先级别高 cin>>t; while(t--){ cin>>n; for(int i=0;i
                    
                     >x; q.push(x); } LL a,b,sum=0;//注意精度 while(q.size()>1){ a=q.top(); q.pop(); b=q.top(); q.pop(); //cout<
                     
                      

?