第一题(两种二分法写法)
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") # 结束