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合并果子的主要内容,如果未能解决你的问题,请参考以下文章

合并果子

合并果子

luogu 1090 合并果子

洛谷-合并果子-优先队列

洛谷 1090合并果子

合并果子