解题思路:1.分别考虑魏蜀吴三国分别获胜所经历的最多事件,然后取最大值
   

注意事项:以空间换时间(避免重复计算,将重复计算的值储存起来,方便使用),最大程度节约时间

参考代码:

n=int(input())
ls_0=list(map(int,input().split()))
ls_1=list(map(int,input().split()))
ls_2=list(map(int,input().split()))
ls_tem=[]
c_x,c_y,c_z=0,0,0
sum_x,sum_y,sum_z=0,0,0
def sanguo(sum_,c_,ls_0,ls_1,ls_2):
    global ls_tem  # 从外部引入全局变量空列表,临时储备数据
    for i in range(n):
        re=ls_0[i]-(ls_1[i]+ls_2[i]) #避免重复计算所设置的中间变量
        if re>=0: 
            c_+=1
            sum_+=re #计算该国数多于其他两国数的总值
        else:
            ls_tem.append(re) #将其他非事件小于其他两国的总值记录
    if sum_==0:#避免因为全是相等引起的误判
        c_=0
    ls_tem=sorted(ls_tem,reverse=True)#降低时间复杂度
    for _ in range(len(ls_tem)): 
        re_2=ls_tem[0]#依次取最大值
        sum_+=re_2#与多的值进行相消知道剩余值小于等于0
        if sum_>0:
            ls_tem.remove(re_2)
            c_+=1
        else:
            break
    return c_
c_x=sanguo(sum_x,c_x,ls_0,ls_1,ls_2)#以下的判断是避免没有意义的运算
ls_tem=[]
if c_x!=n:
    c_y=sanguo(sum_y,c_y,ls_1,ls_0,ls_2)
    ls_tem=[]
    if c_y!=n:
        c_z=sanguo(sum_z,c_z,ls_2,ls_0,ls_1)
re_3=max(c_x,c_y,c_z)#取最大值
if re_3==0:
    print(-1)
else:
    print(re_3)


点赞(0)
 

0.0分

4 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论