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))
posted @ 2020-12-17 15:20  童年の波鞋  阅读(60)  评论(0编辑  收藏  举报