蓝桥杯A组——Python(10.09)Day11

蓝桥杯A组——Python(10.09)Day11

前言:重这篇之后输入格式不写在input里面了,改为写一个print格式

W3T5-三国游戏:

   小蓝正在玩一款游戏,游戏中魏(X)、蜀(Y)、吴(Z)三个国家各自拥有一定数量的士兵X、Y、Z(一开始可以认为都是0)。
   游戏有n个可能会发送的事件,每个事件之间相互独立且最多只发送一次,当第i个事件发送时会分别让X、Y、Z增加(Ai)(Bi)(Ci).
   当游戏结束时(所以事件的发生与否已经确定),如果X,Y,Z的其中一个大于另外两个之和,我们认为其获胜。
   例如,当X>Y+Z时,我们认为魏国获胜,小蓝想知道游戏结束时,如果有其中一个国家获胜,最多发生了多少个事件?如果不存在任何一个让某个国家获胜的情况,请输出-1。
   【输入格式】
输入的第一行包含一个整数n。
第二行包含n个整数表示A,相邻整数之间使用一个空格分隔
第三行包含n个整数表示B,相整数之间使用一个空格分隔
第四行包含n个整数表示C,相邻整数之间使用一个空格分隔

  • 先给代码,根据代码分析
print('【输入格式】\n'
        '输入的第一行包含一个整数n。\n'
        '第二行包含n个整数表示A,相邻整数之间使用一个空格分隔\n'
        '第三行包含n个整数表示B,相整数之间使用一个空格分隔\n'
        '第四行包含n个整数表示C,相邻整数之间使用一个空格分隔\n'
      )
n = int(input())
A = list(map(int,input().split()))
B = list(map(int,input().split()))
C = list(map(int,input().split()))
#sorted()函数当True时降序
new_X = sorted([ A[_] - B[_] - C[_] for _ in range(n) ],reverse=True)
new_Y = sorted([ B[_] - A[_] - C[_] for _ in range(n) ],reverse=True)
new_Z = sorted([ C[_] - A[_] - B[_] for _ in range(n) ],reverse=True)

ans,resX,resY,resZ,sum_X,sum_Y,sum_Z = 0,0,0,0,0,0,0
for i in range(n):
    sum_X,sum_Y,sum_Z  =  sum_X + new_X[i], sum_Y + new_Y[i], sum_Z + new_Z[i]
    resX = resY = resZ = i + 1
    if sum_X>0:
        ans = max(ans,resX)
    if sum_Y>0:
        ans = max(ans,resY)
    if sum_Z>0:
        ans = max(ans,resZ)
    if sum_X<=0 and sum_Y<=0 and sum_Z<=0:
        break
if ans:
    print(ans)
else:
    print(-1)
  •    巧妙地用new数组实现X,Y,Z的最优选择 new_X是X再一次操作中比Y,Z多增加的,又用sorted函数排了最优序 一次循环可同时比较三者的最优解


W3T6-力量的代价:

   有一个长度为n的数组(n是10的倍数),每个数a都是区间[0, 9]中的整数。小明发现数组里每种数出现的次数不太平均,而更改第i个数的代价为bi,
   他想更改若干个数的值使得这10种数出现的次数相等(都等于n/10),请问代价和最少为多少
   【输入格式】
输入的第一行包括一个正整数n。
接下来n行,第i行包括两个整数ai,bi,用一个空格分隔。

  • 属于最简单编程题了,avg = n/10,遍历0~9,如果某个数的数量大于avg则需要改变num[i]-avg个数字,直接选取全部i数字改变需要代价最小的前num[i]-avg个数字即可。
print('【输入格式】\n'
    '输入的第一行包括一个正整数n。\n'
    '接下来n行,第i行包括两个整数ai,bi,用一个空格分隔。\n'
    )
n = int(input())
num,avg,res = [[]for i in range(10)],n//10,0
for i in range(n):
  a,b = map(int,input().split())
  num[a].append(b)
for i in range(10):
  if len(num[i])>avg:
    num[i].sort()
    for _ in range(len(num[i])-avg):
      res += num[i][_]
    #res += num[i][_]在for里面实现对超出avg的数字按代价依次从小到大改变
print(res)
  • 下划线用作占位符变量名还是很好用的,可学。

————————————————————————————————————————
   今天轻松,继续加油💪

W3(D11)——end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值