2519 合并果子

看似普通,一开始我想了想如何才能最小,假设输入是1 2 9,如果先合并 1和9,花10体力,再合2和10,这样的结果明显不是样例输出,如何才能成为样例输出嘞,1先和2合并,再合9合并就可以,那可以得到什么规律呢,我先加一个大数,后面有n个数合并时都要加一遍这个数,那有同学就说了:那简单,我们给输入的数据排个序就可以。但真的是这样吗?

#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long int n;
    cin>>n;
    long long int i;
    long long int a[n];
    for(i=0;i<n;i++)
    {
        cin>>a[i];
    }
    sort(a,a+n);
    long long int sum=0;
    for(i=0;i<n-1;i++)
    {
        sum=sum+a[i]+a[i+1];
        a[i+1]=a[i]+a[i+1];
    }
    cout<<sum<<endl;
    return 0;
}

样例输入输出是对的哈,但错哪了嘞。

有时候我们看问题不能非常全面,太容易想当然了,关于这个题我举个栗子哈,如果我们输入了好多数,有1  5  3  10  9  7吧,我们先试用sort把他排好1  3  5  7  8  10,我们看按原来的代码执行完,1+3用了4,4+5再用9,9+7是用16,16+8=24,又是24,24+10又加上34,算出来的结果就是87,但是他真的是最小的了吗,如果在合并完前三个(9)我再合并7与8变成15继续合并15与9是24这样的结果会是几呢,13+15+24+34=86,诶嘿,那我们发现上面的不对诶,所以在思考了一会儿之后,我知道怎么改正错误了

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int i;
    int a[n];
    for(i=0;i<n;i++)
    {
        cin>>a[i];
    }
    sort(a,a+n);
    long long int sum=0;
    for(i=0;i<n-1;i++)
    {
        sum=sum+a[i]+a[i+1];
        a[i+1]=a[i]+a[i+1];
        sort(a+i,a+n);
    }
    cout<<sum<<endl;
    return 0;
}

在每次合并完都再一次排序,找出来最小的,这样得到的值才可以保证是想要的结果:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值