codevs1063合并果子
来源:互联网 发布:软件模型 编辑:程序博客网 时间:2024/05/16 06:53
这个题感觉应该算是个贪心
每次合并重量最小的两堆果子
我不知道我下面这样证明对不对- -我没有学过数学归纳法什么的
假设有三堆果子,a1 a2 a3那么消耗体力有三种情况a1+a2 + a1+a2+a3a1+a3 + a1+a2+a3a2+a3 + a1+a2+a3显然第二次合并果子消耗的体力都是相同的所以应该在第一次合并的时候消耗最少的体力即第一次合并应该选择min(a1+a2,a1+a3,a2+a3)每次合并完之后把合并出来的一个新果子堆冒泡冒上去就可以了不过应该也可以用大根堆这样的话复杂度应该主要就是冒泡排序贡献的了大概最坏是O(n^2)
代码如下
#include <iostream>#include <algorithm>using namespace std;int w[10001],n;void chang(int x,int y){ w[x]^=w[y]; w[y]^=w[x]; w[x]^=w[y];}void bub(int f){ for(int i=f;i<n;++i) { if(w[i]>w[i+1])chang(i,i+1); else return; }}bool cmp(int x,int y){ return x<y?1:0;}int main(){ int ans=0; cin>>n; for(int i=1;i<=n;++i) cin>>w[i]; sort(w+1,w+n+1); //for(int i=1;i<=n;++i)//test //cout<<w[i]<<' ';//test //cout<<'\n';//test for(int i=1;i<n;++i) { //cout<<i<<" "<<w[i]<<' '<<w[i+1];// w[i+1]+=w[i]; w[i]=0; //cout<<' '<<w[i]<<' '<<w[i+1];// ans+=w[i+1]; //cout<<' '<<ans<<'\n';// bub(i+1); } cout<<ans; return 0;}
阅读全文
0 0
- codevs1063 合并果子 贪心
- codevs1063 luogu1090 合并果子
- codevs1063合并果子
- 【基础练习】【堆】codevs1063 合并果子题解
- 【codevs1063&&NOIP04PJ】合并果子,贪心の钻石
- [解法二] CodeVS1063 合并果子 题解
- Codevs1063 合并果子(2004年NOIP全国联赛普及组)
- 合并果子
- 合并果子
- 合并果子
- 合并果子
- 合并果子
- 合并果子
- 合并果子
- 果子合并
- 合并果子
- 合并果子
- 合并果子
- [算法基础]几个关于递归算法的练习题
- Codeforces 864C Round#436 C :果然还是模拟最难
- js实现2048小游戏
- find: ‘/run/user/1000/gvfs’: Permission denied
- Problem J. Worried School(日期模拟 STL)
- codevs1063合并果子
- 渗透测试 | 无线渗透 | 2-无线网络架构
- Redis
- 数学之美笔记1
- I2C初始化
- Mac本提示-bash: wget: command not found
- js的栈堆概念
- 手把手教你搭建一款简单应用
- Python Koans Solution —— Assert