当前位置 博文首页 > ljmhxs的博客:P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV

    ljmhxs的博客:P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV

    作者:[db:作者] 时间:2021-08-19 13:35

    贪心做法:

    这道题其实特别简单,稍微理解一下** 样例 **就可以了:

    样例是:

    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!!! 

    cs
    下一篇:没有了