首页 > 试题广场 >

运矿石

[编程题]运矿石
  • 热度指数:3439 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
小v最近在玩一款挖矿的游戏,该游戏介绍如下:
1、每次可以挖到多个矿石,每个矿石的重量都不一样,挖矿结束后需要通过一款平衡矿车运送下山;
2、平衡矿车有左右2个车厢,中间只有1个车轮沿着导轨滑到山下,且矿车只有在2个车厢重量完全相等且矿石数量相差不超过1个的情况下才能成功运送矿石,否则在转弯时可能出现侧翻。
假设小v挖到了n(n<100)个矿石,每个矿石重量不超过100,为了确保一次性将n个矿石都运送出去,一旦矿车的车厢重量不一样就需要购买配重砝码。请问小v每次最少需要购买多少重量的砝码呢? (假设车厢足够放下这些矿石和砝码,砝码重量任选)


输入描述:
输入n个正整数表示每个矿石的重量


输出描述:
输出一个正整数表示最少需要购买的砝码重量
示例1

输入

3 7 4 11 8 10

输出

1

说明

小v可以将重量3,7和11的矿石放到左车厢,重量4,8和10 放到右车厢,然后购买重量为1的砝码放到左车厢

备注:
如果n为奇数则左右车厢里的矿石数量相差一个,如果n为偶数则车厢两边的矿石数量相等
def solution(stone_list):
    
    # 不用背包或者动态规划法
    left = stone_list[:len(stone_list) // 2]  # 将矿石分为两组
    right = stone_list[len(stone_list) // 2:]  # 数量差最多是1
    aver = sum(stone_list) / 2  # 平均重量(最终目的是让两组的重量最接近均重,这样二者差值最小,所需的砝码也最小!)
    for i in range(len(left)):
        for j in range(len(right)):
            if abs(sum(left) + right[j] - left[i] - aver) < abs(sum(left) - aver):  # 如果把右边的任一矿石和左边的交换,使得左边相对于平均重量的差的绝对值变小了,那就交换!
                left.insert(i, right.pop(j))  # 把右边组的那个元素删除并加进左边组
                right.insert(j, left.pop(i + 1))  # 同理把左边组的元素加进右边组,注意是i + 1,因为刚刚多了一个元素
    return abs(sum(left) - sum(right))  # 最后只要返回两组的差的绝对值就可以了
    pass

stone_list = [int(i) for i in input().split()]
print(solution(stone_list))

编辑于 2020-12-09 17:02:33 回复(0)
while True:
    try:
        import sys
        import random
        line = list(map(int, sys.stdin.readline().split()))
        n = len(line)
        summary = sum(line)
        m = n//2
        line = sorted(line)
        summary_1 = 0
        list_1 = []
        picked = list()
        for i in range(1000):
            j = 0
            summary_1 = 0
            picked = []
            while j <= m:
                pick = random.randint(0, n-1)
                if pick not in picked:
                    summary_1 += line[pick]
                    j += 1
                else:
                    picked.append(pick)
            summary_2 = summary - summary_1
            fa = int(abs(summary_1 - summary_2))
            list_1.append(fa)
        fama = sorted(list_1)
        print(fama[0])
    except:
        break

哪位大牛看看到底哪里错了,通过率80多~~~
发表于 2020-02-26 16:08:25 回复(0)