蓝桥杯第6天(Python组)

本文展示了使用Python实现的几种算法策略,包括利用二分查找解决可分蛋糕问题,通过前缀和处理矩阵计算,以及应用贪心算法进行背包问题和字符串翻转问题的求解。同时,还包括了一个根据道具价值选择使用顺序的问题。
摘要由CSDN通过智能技术生成
第一题(两种二分法写法)

import os
import sys

# 请在此输入您的代码
def check(d):  # 检查蛋糕大小为d是否可分
  num = 0
  for i in range(n):
    num+=(w[i]//d)*(h[i]//d)
  if(num>=k):return True
  else:return False

h = [0]*100010
w = [0]*100010
n,k = map(int,input().split())
for i in range(n):  # 读入蛋糕大小
  h[i],w[i] = map(int,input().split())

L,R = 1,100010   # 结尾更大防止出现边界问题
while L<R:
   mid=(L+R+1)//2   # 偶数中值为右值 [1,2] -->2  ,没有则取前
   if(check(mid)):
     L=mid
   else:
     R=mid-1
 print(L)

#  mid=(L+R)//2    #偶数中值为左值  [1,2] -->1  ,没有则取后
#  if(check(mid)):
#    L=mid+1
#  else:
#    R=mid
#print(L-1)

第二题(转为二分问题)
import os
import sys

# 请在此输入您的代码
def y(x):
  return a*x*x*x+b*x*x+c*x+d
a,b,c,d = map(int,input().split())
# print(a,b,c,d)
for i in range(-100,100):  # [-100,-99)
  L,R = i,i+1    # 划分200个子区间
  y1,y2 = y(L),y(R)
  if (y1==0):
    print("{:.2f}".format(L),end=' ')  #格式化输出,保留两位小数
  if y1*y2<0:
    while(R-L)>=0.01:
      mid = (L+R)/2
      if y(mid) * y(R) <= 0 : L=mid
      else:
          R = mid
    print("{:.2f}".format(L),end=' ')
if y(100)==0:  # 讨论100
  print("{:.2f}".format(100),end=' ')
        

第三题(前缀和)
import os
import sys

# 请在此输入您的代码

n,m,k = map(int,input().split())
a=[[0] for i in range(n)]
a.insert(0,[0]*(m+1))
for i in range(1,n+1):  # 转换二维矩阵形式,即下标从1开始
  a[i].extend(map(int,input().split()))

s = [[0]*(m+1) for i in range(n+1)]  # 预计算前缀和s[][]
for i in range(1,n+1):
  for j in range(1,m+1):
    s[i][j] = s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j]

ans =0
for i1 in range(1,n+1):
  for i2 in range(i1,n+1):
    for j1 in range(1,m+1):
      for j2 in range(j1,m+1):
        cal  = s[i2][j2]-s[i2][j1-1]-s[i1-1][j2]+s[i1-1][j1-1]
        if cal<= k: ans+=1

print(ans)

第四题(贪心)
import os
import sys

# 请在此输入您的代码

n,w = map(int,input().split())
a=[]
for i in range(n):
  gp = list(map(int,input().split()))  # 读入重量和价值
  a.append(gp)
#a = sorted(a,key = lambda x:x[1]/x[0],reverse = True)  # 从大到小排序
a.sort(key = lambda x:x[1]/x[0],reverse = True)
val =0
for k in a: # 贪心算法装货
  if(k[0]<w):
    val+=k[1]
    w-=k[0]  # 计算卡车剩余重量
  else:
    val += w* k[1]/k[0]
    break
print("%.1f"%val)

第五题(贪心)
s = list(input())  # 字符为常量,不支持修改
t = list(input())
ans =0  
# 贪心算法,依次遍历就行
for i in range(len(s)-1): # 最后一个取不到
  if s[i]!=t[i]:  # 找到不同之处就翻转
    if s[i+1]=='*':   #只需要翻转后一位
      s[i+1]='o'
    else:
      s[i+1]='*'
    ans+=1
print(ans)

第六题(贪心)

#总目标:d最大
#d=log2(A)  
#d=log3(B)  
n1,n2 = map(int,input().split())
a = list (map (int,input().split()))
b = list(map(int,input ().split()))
for i in range(n1): # 添加编号
  a[i]=(i+1, a[i])
for i in range(n2): # 添加编号
  b[i]=(i+1,b[i])
# 根据道具值排序
# 思想为先用A小,B大,最后得到的d最大
a.sort(key=lambda x :x[1])
b.sort(key=lambda x :x[1],reverse=True)

s = input ()  # 即A,B使用此顺序
idx1,idx2 = 0,0
for i in range (n1+n2) :  # 循环次数,总的道具数量
  if s[i]=='1':  # 使用B道具
    print("B%d"%b[idx1][0]);idx1+= 1
  else:      # 使用A道具
    print("A%d"%a[idx2][0]);idx2+= 1
print("E")  # 结束
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值