首页 > 代码库 > 9018——1219合并果子
9018——1219合并果子
这题我有2个做法,都是一个o(nlogn)。
简介一下第一个:开2个数组,a,b。
a保存给出数据。给a排个序。
然后因为是有序的,所以,可以把头2个拿出来,合并,放入b,这样可以保证b是有序的
然后每次合并只要比较a,b的头。
然而
我用的是另一个,也就是 堆(优先队列)
#include<iostream> #include<cstdio> #include<cstring> using namespace std; inline int read(){ int t=1,num=0;char c=getchar(); while(c>‘9‘||c<‘0‘){if(c==‘-‘)t=-1;c=getchar();} while(c>=‘0‘&&c<=‘9‘){num=num*10+c-‘0‘;c=getchar();} return num*t; } int cnt=0,a[10010],n; void add(int num){ a[++cnt]=num;int x=cnt,y; while(x>1){ y=x>>1; if(a[y]<=a[x])return; swap(a[y],a[x]);x=y; } } int get(){ int ans=a[1],x=1,y;a[1]=a[cnt--]; while(x<=(cnt>>1)){ y=x<<1; if(y<cnt&&a[y+1]<a[y])y++; if(a[y]>=a[x])return ans; swap(a[x],a[y]);x=y; } return ans; } int main() { n=read();int ans=0; for(int i=1;i<=n;i++)add(read()); for(int i=1;i<n;i++){ int x=get()+get();add(x);ans+=x; } printf("%d\n",ans); return 0; }
本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。
9018——1219合并果子
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。