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

时间: 2024-10-01 12:57:38

ZZUOJ 10510: 石子合并的相关文章

BZOJ 3229: [Sdoi2008]石子合并

3229: [Sdoi2008]石子合并 时间限制: 3 Sec  内存限制: 128 MB提交: 497  解决: 240[提交][][] 题目描述 在一个操场上摆放着一排N堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分. 试设计一个算法,计算出将N堆石子合并成一堆的最小得分. 输入 第一行是一个数N. 以下N行每行一个数A,表示石子数目. 输出 共一个数,即N堆石子合并成一堆的最小得分. 样例输入 4 1 1 1 1 样

2298 石子合并 2008年省队选拔赛山东

题目描述 Description 在一个操场上摆放着一排N堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分. 试设计一个算法,计算出将N堆石子合并成一堆的最小得分. 输入描述 Input Description 第一行是一个数N. 以下N行每行一个数A,表示石子数目. 输出描述 Output Description 共一个数,即N堆石子合并成一堆的最小得分. 样例输入 Sample Input 4 1 1 1 1 样例输出 S

四边形不等式优化DP——石子合并问题 学习笔记

好方啊马上就要区域赛了连DP都不会QAQ 毛子青<动态规划算法的优化技巧>论文里面提到了一类问题:石子合并. n堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分. 求出将n堆石子合并成一堆的最小得分和最大得分以及相应的合并方案. 设m[i,j]表示合并d[i..j]所得到的最小得分. 状态转移方程: 总的时间复杂度为O(n3). [优化方案] 四边形不等式: m[i,j]满足四边形不等式 令s[i,j]=max{k | m[

zjnu1181 石子合并【基础算法?动态规划】——高级

Description 在操场上沿一直线排列着 n堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的两堆石子合并成新的一堆, 并将新的一堆石子数记为该次合并的得分.允许在第一次合并前对调一次相邻两堆石子的次序. 计算在上述条件下将n堆石子合并成一堆的最小得分. Input 输入数据共有二行,其中,第1行是石子堆数n≤100: 第2行是顺序排列的各堆石子数(≤20),每两个数之间用空格分隔. Output 输出合并的最小得分. Sample Input 3 2 5 1 Sample Out

洛谷 P1880 石子合并

题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分. 输入输出格式 输入格式: 数据的第1行试正整数N,1≤N≤100,表示有N堆石子.第2行有N个数,分别表示每堆石子的个数. 输出格式: 输出共2行,第1行为最小得分,第2行为最大得分. 输入输出样例 输入样例#1: 4 4 5 9 4 输出样例#1: 43 54 区间dp

P1880 石子合并

P1880 石子合并 题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分. 输入输出格式 输入格式: 数据的第1行试正整数N,1≤N≤100,表示有N堆石子.第2行有N个数,分别表示每堆石子的个数. 输出格式: 输出共2行,第1行为最小得分,第2行为最大得分. 输入输出样例 输入样例#1: 4 4 5 9 4 输出样例#1:

luogu P1880 石子合并

题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分. 输入输出格式 输入格式: 数据的第1行试正整数N,1≤N≤100,表示有N堆石子.第2行有N个数,分别表示每堆石子的个数. 输出格式: 输出共2行,第1行为最小得分,第2行为最大得分. 输入输出样例 输入样例#1: 4 4 5 9 4 输出样例#1: 43 54 区间动态规

洛谷1880 石子合并

P1880 石子合并 题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分. 输入输出格式 输入格式: 数据的第1行试正整数N,1≤N≤100,表示有N堆石子.第2行有N个数,分别表示每堆石子的个数. 输出格式: 输出共2行,第1行为最小得分,第2行为最大得分. 输入输出样例 输入样例#1: 4 4 5 9 4 输出样例#1:

[NYIST737]石子合并(一)(区间dp)

题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=737 很经典的区间dp,发现没有写过题解.最近被hihocoder上几道比赛题难住了,特此再回头重新理解一遍区间dp. 这道题的题意很明确,有一列石子堆,每堆石子都有数量,还有一个操作:相邻两堆石子合并成一堆石子,这个操作的代价是这两堆石子的数目和.要找一个合并次序,使得代价最小,最终输出最小代价. 这个题可以用动态规划,简单分析可以得知,这一列石子堆都可以划分为小区间,每个小区间