码蹄杯进阶
MC0373
简单题简单想:双指针模拟
注意:直接暴力模拟逐次相减肯定不行,得用乘除
n,m=map(int,input().split())q1=[]
for _ in range(n):q1.append(list(map(int,input().split())))q2=[]
for _ in range(m):q2.append(list(map(int,input().split())))#简单题简单想:双指针模拟
from math import ceil
l1=l2=0
while l1<n and l2<m:n1=ceil(q1[l1][0]/q2[l2][1])n2=ceil(q2[l2][0]/q1[l1][1])#直接暴力模拟逐次相减肯定不行,得用乘除if n1==n2:l1+=1l2+=1elif n1<n2:q2[l2][0]-=n1*q1[l1][1]#更改前先使用l1+=1else:q1[l1][0]-=n2*q2[l2][1]l2+=1if l1==n and l2==m:print('Fine')
elif l1<n:print('Win')
else:print('QAQ')
MC0356
全1 + 最大值
注意:strip得赋值
def main():#code heres=[]n=int(input())for _ in range(n):s.append(input())ans=0l1=0for i in s:L0=len(i)i=i.lstrip('1')# strip不会改变原值!L1=len(i)i=i.rstrip('1')L2=len(i)#print(i,L0-L1,L1-L2,i2)if L1==0:l1+=L0 # 所有为1的都可以串结果上else:ans=max(ans,L0-L1,L1-L2)print(ans+l1)passif __name__ == '__main__':main();
MC0359
找规律:
子序列等差增加数量 s[l][r] = s[l][r-1] + K(当前等差数列长度)
MC0355
def main():# set后第二小的n=int(input())a=list(map(int,input().split()))sa=set(a)la=list(sa)la.sort(reverse=False)print(la[1])passif __name__ == '__main__':main();
MT2001
幸运的3
3的倍数的特征是 各位数相加后和为3的倍数,那么可以通过存储各个数对3取余后的结果然后实现配对(数组的 in 和 remove 操作)
n=int(input())a=list(map(int,input().split()))n=[]def cnt(k):ans=0while k:ans+=k%10k//=10return ansfor i in a:n.append(cnt(i)%3)vis=[]res=0
for i in n:if (3-i) in vis:res+=1vis.remove(3-i)elif i==0 and 0 in vis:res+=1vis.remove(0)else:vis.append(i)print(res)
MT2002
买马
文字理解题目:找一个最小数使得输入数对其取模后都不一样
本来以为暴力枚举过不了的,但是过了。。。
n=int(input())nums=[]
ma=0
for i in range(n):now=int(input())ma=max(ma,now)nums.append(now)i=1
while True:flag=1vis=[0]*mafor k in nums:if vis[k%i]:flag=0breakelse:vis[k%i]=1if flag:print(i)breaki+=1
MT2003
三角数
还是暴力枚举//
枚举前分析了一下数据范围:
ans*2 = a2 + a + b2 + b <= (a+b)**2
所以一定可以通过取根来缩小数据范围
n=int(input())import mathn2=2*nsu=int(math.sqrt(n2))flag=0for i in range(1,su): #正整数if flag:breakfor j in range(su-1,0,-1):if i**2+i+j**2+j==n2:print('YES')flag=1breakif not flag:print('NO')
MT2004
题意:小于输入的最大回文数
且注意看题目:输入可能有前导零
前面的肯定不能动,只能动后面的数位
2014
#简化问题:有多少个子序列:用一个个数组存储n=int(input())h=list(map(int,input().split()))l=[]for i in h:flag=0for j in range(len(l)):if l[j][0]-1==i:l[j]=[i]+l[j]flag=1breakif not flag:l.append([i])#print(l)
print(len(l))
2015
注意是第一个不被覆盖的点,而不是能到达的最远
且注意线段编号
n, d, m, l = map(int, input().split())pos = 0
while True:# 找对应的线段编号k = pos // m + 1if k > n: # 已经超过所有线段print(pos)break# 当前线段覆盖范围left = (k-1)*mright = left + lif left <= pos <= right:pos += delse:print(pos)break
0252
就是找四角,但是注意是先输出行数还是列数
N, M = map(int, input().split())
T = int(input())ma = [list(map(int, input().split())) for _ in range(N)]
av = [[0]*M for _ in range(N)]for i in range(N):for j in range(M):if ma[i][j] <= T:av[i][j] = 1# 初始化边界
top = N
bottom = -1
left = M
right = -1for i in range(N):for j in range(M):if av[i][j]:top = min(top, i)bottom = max(bottom, i)left = min(left, j)right = max(right, j)# 输出最小子矩阵的行数和列数
rows = bottom - top + 1
cols = right - left + 1
print(rows)
print(cols)
0251
看到就觉得是完全背包,但是其实根本不用!!
# 看到就觉得是完全背包,但是其实根本不用!!n=int(input())cnt=0
i=0
r=[13,7,3,1]
while n:d=n//r[i]#i+=1cnt+=dn=n%r[i]i+=1print(cnt)
n,k=map(int,input().split())
MOD=(10**k)# 高精度乘法:逐位,可能有进位:自定义函数
# 基于个位的倍数,比如3,那么周期为4,那么cnt+=4'''
# 补0的不一定不行
if n<MOD//10:print(-1)exit()
'''n=str(n%MOD)n.kuai=n
m=n
kuai*=(n**2)
kuai%=MOD
m*=n
m%=MODcnt=1while kuai!=m:kuai*=(n**2)m*=nkuai%=MODm%=MODcnt+=1print(cnt)
0249
简单题简单做
N=int(input())l=list(map(int,input().split()))n=int(input())# 排序:信息利用率for i in range(1,N+1):l[i-1]=[l[i-1],i]
#print(l)l=sorted(l,key=lambda x:(x[0],-x[1]),reverse=True)for i in range(n):print(l[i][1],end=' ')
0248
s=input()L=len(s)if L<=6:print('False')exit()flag1=[0,0,0]flag2=0for i in s:if '1'<=i<='9':flag1[2]=1if flag2:print('False')exit()flag2=1else:flag2=0if 'a'<=i<='z':flag1[0]=1elif 'A'<=i<='Z':flag1[1]=1
if sum(flag1)==3:print('True')
else:print('False')
0247
注意是26进制!!
s=input()L=len(s)l=0
r=0def checktype(k):if '0'<=k<='9':return 0else:return 1ans=''# 轮转:26进制!while r<L:if checktype(s[l])!=checktype(s[r]):if checktype(s[l])==1:cnt=0for i in range(r-1,l-1,-1):cnt+=26**(r-i-1)*(ord(s[i])-97)ans+=str(cnt)else:add=''cnt=int(s[l:r])while cnt:add+=chr(cnt%26+97)cnt//=26ans+=add[::-1]l=relse:if r==l:if s[l]=='0':ans+='a'l+=1elif s[l]=='a':ans+='0'l+=1r+=1if checktype(s[l])==1:cnt=0for i in range(r-1,l-1,-1):cnt+=26**(r-i-1)*(ord(s[i])-97)ans+=str(cnt)
else:add=''cnt=int(s[l:r])while cnt:add+=chr(cnt%26+97)cnt//=26ans+=add[::-1]
print(ans)