ZZUOJ 10510: 石子合并

题目链接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

 

posted @ 2017-09-09 09:20  EricJeffrey  阅读(339)  评论(0编辑  收藏  举报