算法001-合并果子
迪丽瓦拉
2025-05-31 02:04:50
0

小明来果园摘果子。摘果子的过程中,果子被随机地分成了几堆。果子摘完了,小明想把这些果子合并成一堆,请你设计一个算法使小明搬果子消耗的体力最少。
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插入数组中的下标poswhile (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 queue = new PriorityQueue<>();int result = 0;for(int i=0;iqueue.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 = 0for i in range(1, num):temp = fruits[i] + fruits[i - 1]result += temppos = i + 1while pos < num and fruits[pos] < temp:fruits[i - 1] = fruits[i]pos += 1fruits[pos - 1] = tempreturn resultif __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)

测试结果
在这里插入图片描述

相关内容