解题思路: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分
4 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复