POJ 3253

/*
有一个农夫要把一个木板钜成几块给定长度的小木板,每次锯都要收取一定费用,这个费用就是当前锯的这个木版的长度
给定各个要求的小木板的长度,及小木板的个数n,求最小费用
3
8 8 5为例:
长度为 21 的木板,截成13和8花费 21
再从长度为13的木板上锯下长度为5的木板,花费13
 共21+13 =34
*/
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int main()
{
    int i,j,k,T;
    __int64 num,sum=0;
    while(cin>>T)
    {
        sum = 0;
        //因为运算结果可能超过int,所以虽然输入不超过int,也必须定义为__int64 
        priority_queue <__int64, vector<__int64> ,greater<__int64> > q;//两个双尖括号中间必须有空格 
        while(T--)
        {
            cin>>num;
            q.push(num);
        }
       // cout<<q.size()<<endl<<endl<<endl;
        while(q.size()>1)
        {
            __int64 a = q.top();
            q.pop();
            __int64 b = q.top();
            q.pop();
            q.push(a+b);
            sum+=a+b;
        }
        q.pop();
        cout<<sum<<endl;
    }
    return 0;
}
  
  
  
#include <iostream>
#include <algorithm>
using namespace std; 
const int MAX = 20001; 
int n; 
int blanks[MAX]; 
__int64 sum; 
int main() 
{
    int i,j; 
    while(cin>>n) 
    { 
    	sum = 0; 
    	for(i = 0; i < n; i++) 
        { 
    		cin>>blanks[i]; 
    	} 
    	sort(blanks,blanks + n); 
    	for(i = 1; i < n; i++) 
        { 
    		blanks[i] += blanks[i-1]; 
    		sum += blanks[i]; 
    		for(j = i; j < n-1; j++) 
            {//不必每次排序,逐个比较插入新的数据 
        		if(blanks[j] > blanks[j + 1]) 
        		  swap(blanks[j],blanks[j+1]); 
            }
        }
    	cout<<sum<<endl; 
    } 
    return 0;
}






//wa,理解错了题意,不存在无限长的木板, 
#include <iostream>
#include <cstdlib>
#include <algorithm>
using namespace std;
__int64 ch[20005];
int cmp(const void *a,const void *b)
{
    return *(__int64 *)a-*(__int64 *)b;
}
int main()
{
    int i,j,k,T;
    __int64 num,sum;
    while(cin>>T)
    {
        memset(ch,0,sizeof(ch));
        sum=0;
        i=0;
        while(T--)
        {
            cin>>num;
            sum += num;
            ch[i++]=num;
        }
     //   cout<<sum<<endl;
        qsort(ch,i,sizeof(__int64),cmp);
       // for(k=0;k<i;k++)
        //    cout<<ch[k]<<endl;
        for(j=0;j<i-1;j++)
            sum+=ch[j];
        cout<<sum<<endl;
    }
    return 0;
}
  

 

posted @ 2012-08-08 16:25  加拿大小哥哥  阅读(418)  评论(0编辑  收藏  举报