当前位置 博文首页 > ljmhxs的博客:P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV
这道题其实特别简单,稍微理解一下** 样例 **就可以了:
于是发现:先合并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!!!
cs