合并果子(优先队列)
2016-08-11 11:25
316 查看
Description
现在有n堆果子,第i堆有ai个果子。现在要把这些果子合并成一堆,每次合并的代价是两堆果子的总果子数。求合并所有果子的最小代价。
Input
每组数据第一行包含一个整数n(2<=n<=1000),表示果子的堆数。
第二行包含n个正整数ai(ai<=100),表示每堆果子的果子数。
Output
每组数据仅一行,表示最小合并代价。
Sample Input
Sample Output
Hint
题意:每次找到序列中最小的两个数相加累加到一堆果子;
方法:优先队列
交换函数
方法一:
//每组测试数据时建立队列则 队列不用清空,如队列在主函数外建立,则每次都必须清空队列;
现在有n堆果子,第i堆有ai个果子。现在要把这些果子合并成一堆,每次合并的代价是两堆果子的总果子数。求合并所有果子的最小代价。
Input
每组数据第一行包含一个整数n(2<=n<=1000),表示果子的堆数。
第二行包含n个正整数ai(ai<=100),表示每堆果子的果子数。
Output
每组数据仅一行,表示最小合并代价。
Sample Input
4 1 2 3 4 5 3 5 2 1 4
Sample Output
<pre class="sampledata" name="code" style="white-space: pre-wrap; word-wrap: break-word;">
19 33
Hint
题意:每次找到序列中最小的两个数相加累加到一堆果子;
方法:优先队列
交换函数
方法一:
#include<stdio.h> #include<algorithm> #include<iostream> #include<string.h> #include<queue> int a[10100]; using namespace std; int main () { int n; while(~scanf("%d",&n)) { priority_queue<int ,vector<int>,greater<int> >q; //从小到大排列,如从大到小则把greater变为less; int i,j,t1,t2,t,sum=0; for(i=0; i<n; i++) { scanf("%d",&a[i]); q.push(a[i]); } while(true) //队列内不为空执行; { t1=q.top(); q.pop(); t2=q.top(); q.pop(); t=t1+t2; sum+=t; if(q.empty()) //队列释放出来后在再次放入队列中前判断队列是否为空,为空则已经执行完程序,只需要直接加入总的数值中; break; q.push(t); } printf("%d\n",sum); } return 0; }
#include<stdio.h> #include<algorithm> #include<iostream> #include<string.h> #include<queue> using namespace std; int a[10100]; int n; int main () { while(~scanf("%d",&n)) { priority_queue<int>q; //从大到小排列; int t,sum=0; for(int i=0; i<n; i++) { scanf("%d",&a[i]); q.push(-a[i]); //取负放入队列中; } while(q.size()-1) //每次放入队列则 只剩一个元素时则结束程序; { t=-q.top(); q.pop(); t-=q.top(); q.pop(); sum+=t; q.push(-t); } printf("%d\n",sum); } return 0; }
//每组测试数据时建立队列则 队列不用清空,如队列在主函数外建立,则每次都必须清空队列;
#include<stdio.h> #include<algorithm> #include<iostream> #include<string.h> #include<queue> using namespace std; int a[10100]; int n; priority_queue<int>q; //从大到小排列; int main () { while(~scanf("%d",&n)) { int t,sum=0; for(int i=0; i<n; i++) { scanf("%d",&a[i]); q.push(-a[i]); //取负放入队列中; } while(q.size()-1) //每次放入队列则 只剩一个元素时则结束程序; { t=-q.top(); q.pop(); t-=q.top(); q.pop(); sum+=t; q.push(-t); } while(!q.empty()) //清空队列; q.pop(); printf("%d\n",sum); } return 0;方法二:
#include<stdio.h> #include<algorithm> using namespace std; int a[10010],n; void df(int x) //循环找到最小的数值交换; { int i,t,q; q=x; for(i=q+1;i<=n;i++) { if(a[i]<a[q]) q=i; } swap(a[x],a[q]); } int main() { int i,sum; while(~scanf("%d",&n)) { sum=0; for(i=1;i<=n;i++) scanf("%d",&a[i]); df(1); df(2); for(i=2;i<=n;i++) { a[i]+=a[i-1]; sum+=a[i]; df(i); //循环中调用交换函数; df(i+1); } printf("%d\n",sum); } return 0; }
相关文章推荐
- C++ STL第一次——果子合并(优先队列)
- 合并果子 (优先队列小根堆)
- NYOJ 55 懒省事的小明/合并果子(优先队列)
- 合并果子 (优先队列小根堆)
- Luogu-p1090 合并果子(优先队列)
- 树-堆结构练习——合并果子之哈夫曼树 (STL 优先队列)
- 2127-树-堆结构练习——合并果子之哈夫曼树(优先队列实现)
- 合并果子(优先队列)
- 【贪心】CODE[VS] 1063 NOIP2004普及组-合并果子 (刷题记录(模拟+优先队列))
- SDNU1171.合并果子优先队列
- tyvj 1066 合并果子(优先队列)
- 堆排序(优先队列)——合并果子
- 合并果子(贪心+优先队列)
- CSU 1588 合并果子(贪心 优先队列)
- 合并果子之哈夫曼树——优先队列解决哈夫曼
- codevs1063 合并果子 优先队列(小根堆)
- 合并果子 (优先队列小根堆)
- 合并果子 (优先队列小根堆)
- RQNoj 合并果子 优先队列最小堆
- SDUT OJ 树-堆结构练习——合并果子之哈夫曼树 C++优先队列练习