【kickstart2020 round D】前两题python解题思路

因为招行夏令营没有参加D轮,但事实是参加了依然是一题选手,无奈,在此总结前两题python解题思路。

题目1 Record Breaker

解题思路:
前缀max

代码:

T=int(input())
for tt in range(T):
    N=int(input())
    num=[int(i) for i in input().split()]
    pre_max=[-1] # 此处注意不可以是0
    for i in range(N):
        pre_max.append(max(pre_max[-1],num[i]))
    ans=0
    for i in range(N):
        if i!=N-1:
            if num[i]>pre_max[i] and num[i]>num[i+1]:
                ans+=1
        else:
            if num[i]>pre_max[i]:
                ans+=1
    print('Case #{}: {}'.format(tt+1,ans))

题目2 Alien Piano
讲真这道题我读了特别多遍。。
解题思路:
1 DP

if (ar[i] > ar[i - 1])
dp[i][j] = Math.min(dp[i][j], dp[i - 1][k] + ((j > k) ? 0 : 1));  # 若j
else if (ar[i] < ar[i - 1]) 
dp[i][j] = Math.min(dp[i][j], dp[i - 1][k] + ((j < k) ? 0 : 1));  # 若j>k 则需要一次violation
else:
dp[i][j] = Math.min(dp[i][j], dp[i - 1][j]);
if (j != k) 
    dp[i][j] = Math.min(dp[i][j], dp[i - 1][k] + 1);
# 若j!=k则需要一次violation                          

2 贪心

t = int(input())
 
for tt in range(T):
    n = int(input())
     
    up = 0
    down = 0
    violations = 0
     
    l = list(map(int,input().split()))
     
    for j in range(1,len(l)):
        if(l[j]==l[j-1]):
            continue
        if(l[j]>l[j-1]):
            up += 1
            down = 0
        else:
            down += 1
            up = 0
        if(up>3 or down>3):
            violations+=1
            up = 0
            down = 0
    print('Case #{}: {}'.format(tt+1,violations))

你可能感兴趣的:(kickstart)