[2004年NOIP提高组] 合并果子

[2004年NOIP提高组] 合并果子

  • 分析:根据题意,最先合并的果子加的次数最多,所以在每次合并时都要选取最小的两个进行,这就用到了排序算法,一开始给所有的果子从小到大排序,这里使用了快速排序,然后在每一次合并完最小的两个后,将合并完的数与剩余的数进行比较,在这里用1次冒泡,效率是最高的,在每次合并时设一个变量记录消耗的体力,最后输出。
  • #include<cstdio>
    #include<iostream>
    using namespace std;
    int a[10001];
    void quick(int l,int r)//快速排序
    {
    int i=l,j=r;
    int mid=a[(l+r)/2];
    if(i>=r) return;
    while(i<=j)
    {
    while(a[i]<mid) i++;
    while(a[j]>mid) j--;
    if(i<=j)
    {
    swap(a[i],a[j]);
    i++;j--;
    }
    }
    quick(l,j);
    quick(i,r);
    }
    int main()
    {
    int n,x,i,j,sum=0;
    cin>>n;
    for(i=1;i<=n;i++)
    cin>>a[i];
    quick(1,n);
    for(i=1;i<n;i++)
    {
    x=a[i]+a[i+1];//合并最小的两个
    sum+=x;
    for(j=i+1;j<=n;j++)//1此冒泡进行排序
    {
    a[j]=a[j+1];//将前面已合并完空出的地方覆盖
    if(x<a[j])//合并后的数小
    {
    a[j]=x;//将小数移到大数前面
    break;
    }
    }
    if(j>n) a[n]=x;//合并后的数最大 放在最右边
    }
    cout<<sum;
    return 0;
    }

posted @   4lovls  阅读(68)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示