b_zj_头条校招(分类讨论)
一场考试包含3道题,难度从小到大分别为a,b,c,且满足下列条件:
a<=b<=c
b-a<=10
c-b<=10
所有出题人一共出了n(n<1e5)道开放性题目,然而由于上述条件的限制,可能有一些考试没法凑够3道题,你能计算出我们最少还需要再出几道题吗?
思路:
- 如果两道题相差20以上,则需要额外添加两道
- 如果三道题都在10及以内,那这三道可以尝试看做一套题,故f[i]=min(f[i], f[i-3])
- 如果D[i]-D[i-1]<=20,在中间添加一道题即可,故f[i]=min(f[i], f[i-1]+1)
只过了70%...不清楚哪里有错
def solve(n,A):
d,f=0,[0]*(n+1)
for i in range(1,n+1):
if i>=1 and A[i]-A[i-1]>20: f[i]=min(f[i], f[i-1]+2) #默认需要额外出两道题
elif i>=1 and A[i]-A[i-1]<=20: f[i]=min(f[i], f[i-1]+1)
elif i>=2 and A[i]-A[i-1]<=10 and A[i-1]-A[i-2]<=10: f[i]=min(f[i], f[i-2])
if i>1: d=max(d,A[i]-A[i-1])
return 3-n%3 if d<=10 else f[n] #如果差值都小于10,则差几道题补几道题
n=int(input())
A=sorted(list(map(int, input().split())))
A.insert(0,0)
print(solve(n,A))