看似普通,一开始我想了想如何才能最小,假设输入是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;
}
在每次合并完都再一次排序,找出来最小的,这样得到的值才可以保证是想要的结果:)