题目描述
狐进行了一次黑客马拉松大赛,全公司一共分为了N个组,每组一个房间排成一排开始比赛,比赛结束后没有公布成绩,但是每个组能够看到自己相邻的两个组里比自己成绩低的组的成绩,比赛结束之后要发奖金,以1w为单位,每个组都至少会发1w的奖金,另外,如果一个组发现自己的奖金没有高于比自己成绩低的组发的奖金,就会不满意,作为比赛的组织方,根据成绩计算出至少需要发多少奖金才能让所有的组满意。
输入描述:
每组数据先输入N,然后N行输入N个正整数,每个数表示每个组的比赛成绩。
输出描述:
输出至少需要多少w的奖金
输入例子:
10 20 32 12 32 45 11 21 31 41 33
输出例子:
20
题目来源:搜狗
题意分析:先说下思路,一开始只是考虑到11,21,32,54,11,22这种情况的,设想的是如果遇到比前一个大的就
加一,如果遇到比前面小的就初始化为1,弄一个数组存这些数,但是如果遇到下面这种情况就不行了,例如:11,21,32,54,33,22,11,这样的话,会导致答案错误。解决办法的是弄两个数组,一个数组按照正常的顺序遍历,另一个数组倒序遍历,然后比较两个数组的值,取较大的值即可。
综上,两个方向(正向和反向)都满足自己的奖金要大于比自己成绩低的团队的奖金, 对两个方向的各个位置去最大值再求和,即为最后的结果。
import sys
while True:
line = sys.stdin.readline()
if not line:
break
line = int(line.strip())
# create a list, length is line
res1 = [1] * line
res2 = [1] * line
result = []
for i in range(line):
result.append(int(sys.stdin.readline().strip()))
for i in range(1, line):
if result[i] > result[i - 1]:
res1[i] = res1[i - 1] + 1
for i in range(line - 2, -1, -1):
if result[i] > result[i + 1]:
res2[i] = res2[i + 1] + 1
print sum([max(x, y) for x, y in zip(res1, res2)])