P1090 [NOIP2004 提高组] 合并果子

原题链接

题解

每次从所有果子堆中选重量最小的两堆并累加,观察到只需要找出 最小 因此考虑用堆,而当你对于堆的理解足够深之后,可以用c++ 的 priority_queue

代码

#include<bits/stdc++.h>
using namespace std;

int pile[10005]={0};
int len=0;


void in(int x)
{
    pile[++len]=x;

    int now=len;
    while(pile[now]<pile[now/2]&&now>1)
    {
        swap(pile[now],pile[now/2]);
        now/=2;
    }
}

int out()
{
    swap(pile[len--],pile[1]);

    int son=2;
    while(son<=len)
    {
        if(son+1<=len&&pile[son+1]<pile[son])
        {
            son+=1;
        }
        if(pile[son]<pile[son/2]) swap(pile[son],pile[son/2]);
        else break;
        son*=2;
    }
    return pile[len+1];
}

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        int x;
        scanf("%d",&x);
        in(x);
    }

    int ans=0;
    while(len>1)
    {
        int sum=out()+out();
        ans+=sum;
        in(sum);
    }

    printf("%d",ans);
    return 0;
}

更简洁的写法:

#include<bits/stdc++.h>
using namespace std;
int pile[10005]={0};
int len=0;
int main()
{
    int n;
    scanf("%d",&n);
    priority_queue<int,vector<int>,greater<int> > q;
    for(int i=1;i<=n;i++)
    {
        int x;
        scanf("%d",&x);
        q.push(x);
    }

    int ans=0;
    while(q.size()!=1)
    {
        int a1=q.top();
        q.pop();
        int a2=q.top();
        q.pop();
        ans+=a1+a2;
        q.push(a1+a2);
    }
    printf("%d\n",ans);
}
posted @   纯粹的  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示