题目链接: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 ", 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 MBSubmit: 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