【组合游戏——贪心】

组合游戏——贪心

链接:https://ac.nowcoder.com/acm/problem/15946
来源:牛客网


题目描述

2018年4月8日星期日,小龙沉迷于一个叫做组合的游戏。

游戏规则是这样的,原本有一个长度为A的大木板,现在把它分成了n份长度可能不一样的木板。每一个模板的长度为Xi,每次游戏都要把这些木板组合为一个完整的木板,但是小龙每次只能拿两个小木板去组合成为一个,然后把这新木板和剩下的木板放在一起,重复以上步骤直到最后只剩下一个木板。

每次组合木板会花费K个金币,K等于拿起的两个木板长度之和,问小明每次玩游戏最少花费是多少?

例如:当有n=3块木板的时候

每一块木板的长度分别是是 1、2、3

第一次拿长度为1 和 2 的木板拼接成长度为3的木板,花费3个金币

此时有两块木板,长度分别为3 和 3

第二次拿长度为3 和3 的木板拼接成长度为6的木板,花费6个金币

总共花费9个金币(最少)。


提示:以下是本篇文章正文内容,下面案例可供参考

一、输入描述:

输入有多组,每一组第一行是n(1 < n <= 200)

接下来第二行到第n+1行,第i+1行表示小木板的长度Xi (Xi <= 200)

二、输出描述:

输出每个样例的最少花费,每个答案占据一行。

分析:

从小到大排序后,最小的两个求和,排序,再求和,依次。

C语言代码:

代码如下:

#include<stdio.h> 
int num[201];                             
long long SUM(int num[],int lenth)                
{                                                                                                                    
	if(lenth==2) 
		return num[0]+num[1]; 
	else   
	{   long long sum;
		int inc=lenth,i;
		while(inc>1)
		{
			inc/=2;
			for(int j=0;j<inc;j++)
    			for(int k=j+inc;k<lenth;k+=inc)
    				if(num[k-inc]>num[k]) 
    				{
    					int temp=num[k];
    					for(i=k-inc;i>=0&&temp<num[i];i-=inc)
    						num[i+inc]=num[i];
    					num[i+inc]=temp;
					}
		}
		sum=num[0]+num[1];
		num[1]=num[0]+num[1];
		return sum+SUM(num+1,lenth-1);
	}
}
int main()
{
    int n,i,j,k,temp;
    long long sum;
    int lenth=n;
    while(scanf("%d",&n)!=EOF)
    {
    	sum=0;
        for(i=0;i<n;i++)
            scanf("%d",&num[i]);
        sum=SUM(num,n);
        printf("%lld",sum);
    }
}

总结

贪心思想,排序算法,数据声明,递归,多组数据的输入

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值