小明来果园摘果子。摘果子的过程中,果子被随机地分成了几堆。果子摘完了,小明想把这些果子合并成一堆,请你设计一个算法使小明搬果子消耗的体力最少。
1)约束条件:
A)每搬运1个果子,会消耗1点体力;
B)每次只能把两堆果子合并到一起。
2)举例理解
例如,摘完后有三堆果子,各堆的数量分别是:1个,3个和8个。最省力的方式是:
A)先把第一堆(1个)和第二堆(3个)搬到一起,共消耗4点体力,现在果子变成了两堆,两堆的数量分别是4个和8个。
B)再把这两堆:4个的一堆,和8个的第二堆,搬到一起,共消耗12点体力,现在果子只有12个的这一堆了。搬运完成。
C)最后,我们可以知道,总共消耗了4+12,一共16点体力。
3)编码和验证要求
输入:要求函数接收一个储存整形数据的向量容器:fruits,来表示几堆果子依次有多少个。
输出:返回一个int型的整数,表示搬运这几堆果子到一起总共需要消耗多少点体力。
测试数据:
第一组:7,4,6,5,8 结果:69
第二组:5,9,3,1,7 结果:54
#Java写法
import java.util.*;
public class Team1 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
String str = in.nextLine();
String[] strArr = str.split(",");
System.out.println("输入:" + Arrays.toString(strArr));
int[] fruits = new int[strArr.length];
for (int i = 0; i < strArr.length; i++) {
fruits[i] = Integer.parseInt(strArr[i]);
}
Arrays.sort(fruits);
int res = carry(fruits);
System.out.println("输出:" + res);
}
}
/**
* 方法1:使用数组
* @param fruits
* @return
*/
public static int carry(int[] fruits) {
int len = fruits.length;
int pos = 0;
int temp = 0;
int result = 0;
for (int i = 1; i < len; i++) {
temp = fruits[i] + fruits[i - 1];
result += temp;
//指向下一个数值的下标
pos = i + 1;
//找到temp插入数组中的下标pos
while (pos < len && fruits[pos] < temp) {
fruits[pos - 1] = fruits[pos];
pos++;
}
//将temp插入到数组的pos-1位置
fruits[pos - 1] = temp;
}
return result;
}
/**
* 方法2:使用使用优先队列PriorityQueue:不传入Comparator对象的话,Java会默认按优先级从小到大排序
* @param fruits
* @return
*/
public static int carry2(int[] fruits) {
PriorityQueue<Integer> queue = new PriorityQueue<>();
int result = 0;
for(int i=0;i<fruits.length;i++){
queue.add(fruits[i]);
}
while(queue.size()>1){
int a = queue.poll();
int b = queue.poll();
result += a+b;
queue.add(a+b);
}
return result;
}
}
测试结果
#Python写法
def carry(fruits):
num = len(fruits)
result = 0
for i in range(1, num):
temp = fruits[i] + fruits[i - 1]
result += temp
pos = i + 1
while pos < num and fruits[pos] < temp:
fruits[i - 1] = fruits[i]
pos += 1
fruits[pos - 1] = temp
return result
if __name__ == "__main__":
str = input()
arr = str.split(",")
print("输入:")
print(*arr, sep=",")
fruits = [int(i) for i in arr]
order_fruits = sorted(fruits)
print("从小到大排序:")
print(*order_fruits, sep=",")
out = carry(order_fruits)
print("输出:")
print(out)
测试结果