前排提醒:仅供参考,未经授权禁止转载。
A题 劲舞团
简单题,log.txt共2000行 ,暴力即可。
参考答案:9
n=2000
res=[]
for _ in range(2000):
c,in_,t=input().split()
res.append([c,in_,int(t)])
print(res)
ans=0
n=len(res)
for i in range(n):
if res[i][0]!=res[i][1]:
continue
st=i
while i+1<n and res[i+1][0]==res[i+1][1] and res[i+1][2]-res[i][2]<=1000:
i+=1
ans=max(ans,i-st+1)
print(ans)
B题 召唤数学精灵
思路:
1.范围过大,无法暴力;
2.注意到B(i)为阶乘,其数值在10之后将全是100的倍数。因为n>10时,n!=1*2*...*5*...*10*......已经有2*5*10存在。
3.由2,只需考虑A(i)是否为100的倍数。
因此只需
考虑如下事实:
若对于某个x有:
即A(x)能被100整除,则:
显然也是200的倍数,因此只需要找出200以内满足要求的数字个数即可。
4.符合3中条件的200以内的x为:
24,175,199,200
共4个。
因此,满足条件的数字个数为:
2024041331404202//200*4+2=40480826628086
最后的2是10以内满足要求的数,即1,3
参考答案:40480826628086
C题 封闭图形个数
本题对于python来说直接秒杀,不多说。
from functools import cmp_to_key
cnt=[1,0,0,0,1,0,1,0,2,1]
def get(num):
res=0
for w in str(num):
res+=cnt[int(w)]
return res
def f(a,b):
if a==b:
return 0
x,y=get(a),get(b)
if x==y:
return -1 if a<b else 1
elif x<y:
return -1
else:
return 1
def solve():
n=int(input())
a=list(map(int,input().split()))
a.sort(key=cmp_to_key(f))
print(*a)
solve()
D题 商品库存管理
方法1:暴力,不多说。显然不能拿到所有分数
方法2:对于区间修改与查询,应该想到:差分数组,树状数组,线段树...etc
由于本题只是对区间整体加上同一个数(1),考虑使用差分数组。
若没有最后撤销执行操作,则只需要O(n)遍历数组,对0计数即可。
然而存在m个撤销操作,由于m范围较大,我们需要O(1)的找到撤销操作对答案的影响。
显然,这只要找到该撤销区间内1的个数即可。
O(1)获得某个区间内1的个数,用简单的前缀和即可解决。
最终时间复杂度为O(n+m)
n,m=map(int,input().split())
t=[]
for i in range(m):
L,R=map(int,input().split())
t.append((L-1,R-1))
dif=[0]*(n+1)
for L,R in t:
dif[L]+=1
dif[R+1]-=1
f=[0]
for d in dif:
f.append(f[-1]+d)
f=f[1:-1]
cnt1=[0]
# print('final:',f)
for x in f:
cnt1.append(cnt1[-1]+int(x==1))
cnt1=cnt1[1:]
# print('cnt1=',cnt1)
cnt0=sum([x==0 for x in f])
# print(cnt0)
for L,R in t:
new=cnt1[R]-cnt1[L-1] if L>0 else cnt1[R]
print(cnt0+new)