javaee论坛

普通会员

225648

帖子

340

回复

354

积分

楼主
发表于 2017-09-19 06:20:08 | 查看: 81 | 回复: 2
小根堆维护一下就好了。

#include <iostream>#include <cstring>#include<cstdio>#define fo(i,a,b) for(int i=a;i<=b;i++)using namespace std;int heap[100001],sz=0;typedef long long ll;int n;inline void put(int y){    heap[++sz]=y;    int x=sz;    while (x>1&&heap[x>>1]>heap[x])    {        swap(heap[x],heap[x>>1]);        x>>=1;    }}inline int get(){    int t=heap[1];    heap[1]=heap[sz--];    int x=1;    while (x<=(sz>>1))    {        int next=x<<1;        if (next<sz&&heap[next|1]<heap[next])next++;        if (heap[next]>=heap[x])return t;        swap(heap[next],heap[x]);        x=next;    }    return t;}int main(){    scanf("%d",&n);    fo(i,1,n)    {        int x;        scanf("%d",&x);        put(x);    }    ll ans=0;    fo(i,1,n-1)    {        int x=get(),y=get();        put(x+y);        ans+=x+y;    }    printf("%lld\n",ans);    return 0;}

普通会员

0

帖子

326

回复

337

积分
沙发
发表于 2024-01-02 04:02:29

专业抢二楼!顺便笑摸狗头(3L)

普通会员

0

帖子

297

回复

324

积分
板凳
发表于 2024-04-18 05:08:32

还是很厉害的

您需要登录后才可以回帖 登录 | 立即注册

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017