CODEVS 1063合并果子
2016-11-09 11:13
218 查看
#include<cstdio> #include<algorithm> using namespace std; int n,a[10010],sum; int main(){ freopen("1063.in","r",stdin); freopen("1063.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+n+1); for(int i=2;i<=n;i++){//从最小的开始合并 a[i]=a[i]+a[i-1]; sum+=a[i]; for(int j=i+1;j<=n;j++){//保证合并后 任然按照从小到大排序!!! if(a[j-1]>a[j]){ int k=a[j]; a[j]=a[j-1]; a[j-1]=k; } } } printf("%d",sum); return 0; }
注意:1048石子归并 与 1063合并果子(本题)的不同
合并果子 只要求n堆进行合并 “多多可以把任意两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。”
而石子归并是在区间上相邻的2堆石子合并。”合并相邻的两堆石子”
请注意这2句话的细微差别。这2道题的题意就完全不同。
为什么石子归并必须要用区间DP呢?因为局部最优解不一定是全局最优解。所以我们不能直接贪心。
下面给出优先队列的优化,也是比较基本的优先队列练习。
//优先队列 #include <iostream> #include <cstdio> #include <algorithm> #include <queue> #include <vector> #include <cstring> using namespace std; int n,x,ans = 0; priority_queue<int,vector<int>,greater<int> >q;//最小值优先 int main() { scanf("%d",&n); for(int i = 1; i <= n; i ++) { scanf("%d",&x); q.push(x); } while(q.size() != 1) { int u = q.top(); q.pop(); int w = q.top(); q.pop(); int z = u + w; ans += z; q.push(z); } printf("%d\n",ans); return 0; }
相关文章推荐
- Codevs 1063 合并果子
- 合并果子 (codevs 1063) 题解
- codevs1063 luogu1090 合并果子
- codevs1063合并果子
- codevs 1063 合并果子 STL 优先队列
- codevs1063 luogu1090 合并果子
- 合并果子_tyvj1066_vijos1097_codevs1063_贪心+堆
- codevs1063 合并果子 优先队列(小根堆)
- 【codevs1063】【NOIP2004PJ】合并果子,贪心の钻石
- [解法二] CodeVS1063 合并果子 题解
- 【贪心】CODE[VS] 1063 NOIP2004普及组-合并果子 (刷题记录(模拟+优先队列))
- [左偏树]CODE[VS] 1063——合并果子
- [Codevs] 1063 合并果子
- 【基础练习】【堆】codevs1063 合并果子题解
- codevs2298 石子合并(直线形
- codevs 1392 合并傻子
- 1063合并果子【解题报告】
- CodeVS 1063 合并果子 题解
- codevs 1766 装果子(二分)
- CODEVS 1063 合并果子