/* 有一个农夫要把一个木板钜成几块给定长度的小木板,每次锯都要收取一定费用,这个费用就是当前锯的这个木版的长度 给定各个要求的小木板的长度,及小木板的个数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; }