1. 程式人生 > >ZZUOJ 10510: 石子合並

ZZUOJ 10510: 石子合並

output zzuoj arch sta problems problem ons put input

題目鏈接:http://acm.zzu.edu.cn:8000/problem.php?id=10510

題目大意:N堆石子,每次可以合並任意兩堆,每次合並的花費是兩堆中重量最小的一個。問最小花費和最大花費。

解題思路:假如有三堆石子a1, a2, a3 從小到大排列,那麽會發現每次選擇最大的兩個合並最終的花費為a1+a2,並且這是最小的。對於最大花費來說,由於每次合並代價是重量最小的,所以我們選擇每次合並重量最小的兩堆,這樣就能使花費最大。

代碼:

 1 typedef long long ll;
 2 const int maxn = 1e5 + 5; 
 3 int n;
 4 ll a[maxn];
5 priority_queue<ll, vector<ll>, greater<ll> > q; 6 7 void solve(){ 8 sort(a, a + n); 9 ll ans1 = 0, ans2 = 0; 10 for(int i = 0; i < n - 1; i++) { 11 ans1 += a[i]; 12 q.push(a[i]); 13 } 14 q.push(a[n - 1]); 15 while(q.size() > 1){ 16
ll u = q.top(); q.pop(); 17 ll v = q.top(); q.pop(); 18 ans2 += min(u, v); 19 q.push(u + v); 20 } 21 22 printf("%lld %lld\n", ans1, ans2); 23 } 24 int main(){ 25 scanf("%d", &n); 26 for(int i = 0; i < n; i++) scanf("%lld", a + i); 27 solve();
28 }

題目:

10510: 石子合並

Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 48 Solved: 12
[Submit][Status][Web Board]

Description

聰明 和 不聰明 要合並n堆石子使之成為一堆,他們每次只能合並其中的兩堆石子,合並石子的體力花費是兩堆石子質量中的較小值,即min(ai,aj),聰明 很聰明,他可以花費最少體力來把石子合並成一堆,不聰明 比較無腦,在合並石子的時候不會考慮很多,現在希望你能求出 聰明 合並這n堆石子的花費,以及 不聰明 在最壞情況下合並這n堆石子的體力花費。

Input

第一行一個整數n (1<=n<=10^5) 第二行n個整數,表示a1 a2 ... An. (1<=ai<=10^6)

Output

輸出一行兩個整數x y,x為聰明的花費,y為不聰明最壞情況下的花費。

Sample Input

4
1 1 2 3

Sample Output

4 6

HINT

Source

JXD

ZZUOJ 10510: 石子合並