9018——1219合并果子
Posted Yzyet
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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合并果子的主要内容,如果未能解决你的问题,请参考以下文章