codevs1063合并果子
2017-09-26 00:28
363 查看
这个题感觉应该算是个贪心
每次合并重量最小的两堆果子
我不知道我下面这样证明对不对- -我没有学过数学归纳法什么的
代码如下
每次合并重量最小的两堆果子
我不知道我下面这样证明对不对- -我没有学过数学归纳法什么的
假设有三堆果子,a1 a2 a3 那么消耗体力有三种情况 a1+a2 + a1+a2+a3 a1+a3 + a1+a2+a3 a2+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; }
相关文章推荐
- 【基础练习】【堆】codevs1063 合并果子题解
- Codevs 1063 合并果子
- 合并果子 (codevs 1063) 题解
- codevs1063 luogu1090 合并果子
- codevs1063 luogu1090 合并果子
- codevs1063 合并果子 优先队列(小根堆)
- 合并果子_tyvj1066_vijos1097_codevs1063_贪心+堆
- [解法二] CodeVS1063 合并果子 题解
- 【codevs1063】【NOIP2004PJ】合并果子,贪心の钻石
- CODEVS 1063合并果子
- [左偏树]CODE[VS] 1063——合并果子
- [Codevs] 1063 合并果子
- 【贪心】CODE[VS] 1063 NOIP2004普及组-合并果子 (刷题记录(模拟+优先队列))
- codevs 1063 合并果子 STL 优先队列
- CodeVS 1063 合并果子 题解
- Codevs1063 合并果子(2004年NOIP全国联赛普及组)
- 1063合并果子【解题报告】
- CODEVS 1063 合并果子
- codevs 1766 装果子(二分)
- [洛谷P1631]序列合并/[codevs1245]最小的N个和