Test001-合并果子

小明来果园摘果子。摘果子的过程中,果子被随机地分成了几堆。果子摘完了,小明想把这些果子合并成一堆,请你设计一个算法使小明搬果子消耗的体力最少。
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)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值