无聊的逗 蓝桥杯 python

 我首先想到的是,先从小到大排序一遍。

给定2个栈盒子:

开始先给2个盒子分别放入最后2个最大值,同时从数据中取出这2个值,

如果哪个盒子小,就从数据中取出最大值加上去,直到数据为空。

如果盒子最后大小不相等的话:

就从最大的盒子取出值,直到相等。

很显然有情况是2个盒子取完都不能相等

40分

n = int(input())
d = input()
data = list(map(int,d.split()))
data.sort()
L1 = 0
L2 = 0
print(data)
for i in range(n):
    if L1>=L2:
        L2 += data.pop(-1)
    else:
        L1 += data.pop(-1)
    print(L1,L2)
if L1 == L2:
    pass
    print("第一次确认", L1)
else:
    print("第一次失败", L1,L2)
    data = list(map(int, d.split()))
    data.sort()
    for i in range(n):
        if L1 == L2:
            print("第二次确认",L1)
            break
        elif L1 > L2:
            L1 -= data.pop(0)
        else:
            L2 -= data.pop(0)
        print(L1, L2)

print(L1)

后面我百度,发现可以把取了和没取设为0,1,枚举全部可能性

再把这些数据一一比对

枚举:我是用递归把所有可能性列完,当然如果不减枝的话,后面对比的数据量很大

于是我把大于全部和的一半剪掉,来进行优化

global allcount
global posSum
global maxposSum
allcount = 0
posSum = 0
maxposSum = sum(data)/2
# print(maxposSum)
out = [0]*n
alldata = list()
def sdf(t=0):
    global posSum
    global allcount
    global maxposSum
    if maxposSum < posSum:
        pass
        return
    if t==n:
        #print(out)
        alldata.append((posSum,out.copy()))
        allcount += 1
        # print((posSum,out))
        pass
        return
    for i in (0,1):
        posSum += i*data[t]
        out[t] = i
        sdf(t+1)
        posSum -= i*data[t]
sdf()

对比:

检查是否用了同一个树枝的函数

def eh(l1,l2,n):
    for i in range(n):
        if l1[i] == 1 and l2[i] == 1:
            return False
    return True

 从大到小,遍历所以枚举出来的可能性,

while:如果在不越界的情况下,对比i与i+t的大小是否相同,

如果相同就进入eh函数对比是否符合条件,符合就退出,输出答案

newAllData = sorted(alldata,reverse=True)
# print(newAllData)
lenall = len(newAllData)
isfind = False
for i in range(lenall):
    t = 1
    while i+t<lenall and newAllData[i][0]==newAllData[i+t][0]:
        # print(newAllData[-i][1],newAllData[-i-t][1],newAllData[i][0])
        if eh(newAllData[i][1],newAllData[i+t][1],n):
            # print(newAllData[i][1],newAllData[i+t][1],newAllData[i+t][0])
            print(newAllData[i+t][0])
            isfind = True
            break
        t+=1
    if isfind:
        break

完整代码 

n = int(input())
d = input()
# d = "1 4 7 9 3 4 7 9 2 4 6 7 28 34 29"

import time
staTime = time.perf_counter()
data = list(map(int,d.split()))
n = len(data)
data.sort()
# print(data)


global allcount
global posSum
global maxposSum
allcount = 0
posSum = 0
maxposSum = sum(data)/2
# print(maxposSum)
out = [0]*n
alldata = list()
def sdf(t=0):
    global posSum
    global allcount
    global maxposSum
    if maxposSum < posSum:
        pass
        return
    if t==n:
        #print(out)
        alldata.append((posSum,out.copy()))
        allcount += 1
        # print((posSum,out))
        pass
        return
    for i in (0,1):
        posSum += i*data[t]
        out[t] = i
        sdf(t+1)
        posSum -= i*data[t]
sdf()
# print(allcount)


def eh(l1,l2,n):
    for i in range(n):
        if l1[i] == 1 and l2[i] == 1:
            return False
    return True

newAllData = sorted(alldata,reverse=True)
# print(newAllData)
lenall = len(newAllData)
isfind = False
for i in range(lenall):
    t = 1
    while i+t<lenall and newAllData[i][0]==newAllData[i+t][0]:
        # print(newAllData[-i][1],newAllData[-i-t][1],newAllData[i][0])
        if eh(newAllData[i][1],newAllData[i+t][1],n):
            # print(newAllData[i][1],newAllData[i+t][1],newAllData[i+t][0])
            print(newAllData[i+t][0])
            isfind = True
            break
        t+=1
    if isfind:
        break

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值