以下代码均通过pypy3 ac

A超市里扫货

按题意模拟即可

n,V=map(int,input().split())
rem,ans=V,1
for v in list(map(int,input().split())):
    if rem<v:
        rem=V
        ans+=1
    rem-=v
print(ans)

B柜台结账

按照题意模拟即可,需要注意,小数部分为0的要返回PLMM

more,less,equ='Happy birthday to MFGG','Happy birthday to YXGG','PLMM'
a1,a2=input().split()
if a2[0]=='0':
    print(equ)
elif a2[0]>'5':
    print(more)
elif a2[0]<'5':
    print(less)
else:
    # 下面判断小数部分首位为5的情况
    hasTail=False
    for i in range(1,len(a2)):
        if a2[i]!='0':
            hasTail=True
            break
    if hasTail:
        print(more)
    else:
        print(more if ord(a1[-1])%2 else less)

C小喵觅食

首先求出小猫到每个点的最短移动距离;假如小猫和妹妹本来距离不超过r2,那么此时小猫直接去找妹妹,就是刚才求的最短距离,否则再求出mm到达每个点的最短距离(注意妹妹原来所在位置不能超过r1),再遍历网格找到所有距离猫猫r2的点,更新最短距离

from typing import *
from collections import *
move=[[1,0],[-1,0],[0,1],[0,-1]]
def find(grid:List[str],k:str)->List[int]:
    for i in range(len(grid)):
        for j in range(len(grid[0])):
            if grid[i][j]==k:
                return [i,j]
def findDis(grid:List[str],p:List[int],maxD:int)->List[List[int]]:
    ans=[[-1]*len(grid[0]) for i in range(len(grid))]
    ans[p[0]][p[1]]=0
    q=deque([p])
    while q:
        arr=q.popleft()
        if ans[arr[0]][arr[1]]>=maxD:
            continue
        for m in move:
            x,y=arr[0]+m[0],arr[1]+m[1]
            if x>=0 and x<len(grid) and y>=0 and y<len(grid[0]) and grid[x][y]!='*' and ans[x][y]==-1:
                ans[x][y]=ans[arr[0]][arr[1]]+1
                q.append([x,y])
    return ans
n,m=list(map(int,input().split()))
r1,r2=list(map(int,input().split()))
grid=[]
for i in range(n):
    grid.append(input())
pm,pp=find(grid,'M'),find(grid,'P') # P和M的位置
dm=findDis(grid,pm,m*n+1)
if abs(pm[0]-pp[0])+abs(pm[1]-pp[1])<=r2:
    print(dm[pp[0]][pp[1]])
else:
    dp=findDis(grid,pp,r1)
    ans=10**9
    for i in range(n):
        for j in range(m):
            if abs(i-pm[0])+abs(j-pm[1])==r2 and dm[i][j]!=-1 and dp[i][j]!=-1:
                ans=min(ans,dm[i][j]+dp[i][j])
    print(-1 if ans==10**9 else ans)

E排队

只有不同的数字之间才能形成逆序对,那么就需要先把不同的数的所有频次的集合求出来,那么没两种数之间就可以形成一个逆序对,且因为两数大小关系唯一,顺序也就确定,利用排列组合求出两数所在的位置种数,以及其他数的位置种数,相乘后求和

from collections import *
mod=10**9+7
n=int(input())
fac=1
for i in range(1,n-1):
    fac=fac*i%mod
count=Counter(input().split())
ans,tot=0,n
for a in count.values():
    tot-=a
    ans=(ans+a*tot*n*(n-1)//2*fac)%mod
print(ans)