【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<k 则需要一次violation
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))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值