因为招行夏令营没有参加D轮,但事实是参加了依然是一题选手,无奈,在此总结前两题python解题思路。
解题思路:
前缀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))