A题
找规律模拟就行
import sys
input = sys.stdin.readline
n=int(input())
ans=[[0]*n for _ in range(n)]
idx=1
for i in range(n):
for j in range(n):
ans[i][j]=idx
idx+=1
if n%2==0:
for i in range(n):
if i%2==1:
ans[i].reverse()
for i in range(n):
for j in range(n):
print(ans[i][j],end=" ")
print()
B题
分解所有因子后排序,从前往后枚举
t=int(input())
for _ in range(t):
n=int(input())
res=[]
for i in range(1,int(n**0.5)+1):
if n%i==0:
res.append(i)
cur=n//i
if cur!=i:
res.append(n//i)
res.sort()
for v in res:
if v*v>n:
print(v)
break
C题
贪心,保证合法的前提下整数部分尽量大。
s=input()
n=len(s)
px=[]
for i in range(n):
if s[i]==".":
px.append(i)
#小数点前的整数尽量大且保证合法,贪心考虑
i,ans=n-1,0
if px:
if i-px[-1]>1:
ans+=int(s[px[-1]+2:i+1])
end=px[-1]+1
point=px.pop()
else:
print(int(s))
exit(0)
for j in px[::-1]:
a=j+2
ans+=int(s[a:point])
cur=int(s[point+1:end+1])
ans+=cur*0.1
end=j+1
point=j
ans+=int(s[:point])
ans+=int(s[point+1:end+1])*0.1
print(round(ans,1))
D题
二分答案(因为k太大了,不然直接贪心最大堆模拟减小即可)
from math import ceil
import sys
input = sys.stdin.readline
n,k,x=map(int,input().split())
arr=list(map(int,input().split()))
arr.sort()
def check(y):
cnt=0
for i in range(n-1,-1,-1):
#需要执行操作,当前元素比最大值大
if arr[i]>y:
cnt+=ceil((arr[i]-y)/x)
if cnt>k:
return False
return True
#本来应该是枚举操作次数k,贪心地用堆取模拟减小当前最大值
#但k太大了,再加上分析最大值最小,决策单调性问题可以用二分值域来考虑
l,r=arr[0]-k*x,arr[-1]
while l<r:
mid=(l+r)>>1
if check(mid):
r=mid
else:
l=mid+1
print(l)