切金条

一块金条切成两半,是需要花费和长度数值一样的铜板的。比如长度为20的 金条,不管切成长度多大的两半,都要花费20个铜板。一群人想整分整块金 条,怎么分最省铜板?

例如,给定数组{10,20,30},代表一共三个人,整块金条长度为10+20+30=60. 金条要分成10,20,30三个部分。 如果, 先把长度60的金条分成10和50,花费60 再把长度50的金条分成20和30,花费50 一共花费110铜板。


但是如果, 先把长度60的金条分成30和30,花费60 再把长度30金条分成10和20,花费30 一共花费90铜板。

输入一个数组,返回分割的最小代价


解题方法:

 {3, 5, 2, 7, 0, 1, 6, 4 };比如有这样一组数据


被圈住的,,除了16(圈错了)都是分出来的金条

这样分,一定花费的代价是最小的,原因,哈夫曼编码,

没有听说过的话你只需要知道,

从一组数据里面每次拿出最小的两个数,相加再放进数组里,知道剩下一个数据为止

他的所有叶子节点到根节点的代价一定是最小的。

package basic_class_04;
import java.util.*;
public class Main {
	
	public static int LessMoney(int[] arr){
		PriorityQueue<Integer> priority = new PriorityQueue<Integer>();
		int sum=0;
		int sur=0;
		for(int i=0;i<arr.length;i++){
			priority.add(arr[i]);
		}
		while(priority.size()!=1){
			sur = priority.poll()+priority.poll();
			sum+=sur;
			priority.add(sur);
		}
		return sum;
	}
	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr = {3, 5, 2, 7, 0, 1, 6, 4 };
		System.out.println(LessMoney(arr));
		
	}
}

自己看着图想一想,很快就能想通

链接:https://ac.nowcoder.com/acm/contest/102333/1099 来源:牛客网 时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒 空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M 64bit IO Format: %lld 题目描述 相信你一定接触过下面这个脑筋急转弯: 工人为老板打工,工作七天可以获得一块金子,工人每天可以分得一点金子,老板必须每天发金子,不能多给,也不能少给,把这个金子两刀,就可以每天给工人发工资,请问怎么? 解题思路:可以将分金子的过程作一个等比数列1:2:4:…… 解:两刀可以将金子分成三份,1/7,2/7,4/7 工作第一天把1/7分给工人 工作第二天把2/7分给工人,并要回1/7那块金子,工人有2/7的金子 工作第三天 把1/7给工人 工人有3/7金子 工作第四天 把前两块金子要回,给工人4/7的金子 工人有4/7的金子 工作第五天把1/7分给工人 工人有5/7的金子 工作第六天把2/7分给工人,并要回1/7那块金子,工人有6/7的金子 工作第七天 把1/7给工人 工人有完整的金子 那么现在小灰灰计划考察小蓝一个类似的问题。 小灰灰总共会提出 𝑡 t 个问题,第 𝑖 i 个问题给出两个参数 𝑙 𝑒 𝑛 𝑖 len i ​ 和 𝑚 𝑖 m i ​ ,代表小蓝有一块包含 𝑙 𝑒 𝑛 𝑖 len i ​ 个单位的金条,她需要支付工人接下来 𝑚 𝑖 m i ​ 天的工资,要求是工人每天手中能够增加 1 1 个单位的金条(也就是说允许工人归还金条,进行“找零”操作)。 对于每个问题,小蓝需要回答至少需要金条多少次才能够支付工人接下来 𝑚 𝑖 m i ​ 天的工资,使得第 𝑗 j 天时工人手上能够具有 𝑗 j 个单位的金条。 输入描述: 第一行一个正整数 𝑡 t,代表问题个数。 接下来 𝑡 t 行,第 𝑖 i 行包含两个空格分隔的整数 𝑙 𝑒 𝑛 𝑖 len i ​ 和 𝑚 𝑖 m i ​ 。 保证: 1 ≤ 𝑡 ≤ 1 0 5 1≤t≤10 5 2 ≤ 𝑙 𝑒 𝑛 𝑖 ≤ 1 0 9 2≤len i ​ ≤10 9 1 ≤ 𝑚 𝑖 ≤ 𝑙 𝑒 𝑛 𝑖 1≤m i ​ ≤len i ​ 输出描述: 输出共 𝑡 t 行,第 𝑖 i 行输出一个整数代表第 𝑖 i 个问题的答案。 示例1 输入 复制 4 2 1 7 7 9 7 14 10 输出 复制 1 2 3 3 环境为python3,ACM模式
最新发布
07-12
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SUNbrightness

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值