贪心做法:
这道题其实特别简单,稍微理解一下** 样例 **就可以了:
样例是:
3
1 2 9
于是发现:先合并1和2,消耗体力为3
再合并这堆3和9,消耗体力为12
加起来一共是15,和样例输出是一样的!
所以我们就有了贪心思路:
永远合并最小的和第二小的,这样消耗的体力最小
代码很少:很好理解(没有那些看不懂的函数,算法之类的)
直接上代码(有注释):(主页解释)
#include <bits/stdc++.h>
using namespace std;
int n,a[10005],min2,min1,mx,cx,sum,x;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
x+=a[i]; //总和
}
while(a[cx]!=x){
min1=INT_MAX,min2=INT_MAX; //刷新最小和次小
for(int i=1;i<=n;i++) if(a[i]<=min1 && a[i]!=INT_MIN) min1=a[mx=i]; //找出最小的
a[mx]=INT_MIN; //防止再次找见
for(int i=1;i<=n;i++) if(a[i]!=INT_MIN && a[i]<=min2) min2=a[cx=i]; //找出次小的
a[cx]+=min1; //将最小的累加到次小上
sum+=a[cx]; //累加体力
}
cout<<sum;
return 0;
}
/*rp++ AC!!!*!/