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;

}

  

 

你可能感兴趣的:(poj)