校招真题练习011 种花(美团)

种花

题目描述
公园里有N个花园,初始时每个花园里都没有种花,园丁将花园从1到N编号并计划在编号为i的花园里恰好种A_i朵花,他每天会选择一个区间[L,R](1≤L≤R≤N)并在编号为L到R的花园里各种一朵花,那么园丁至少要花多少天才能完成计划?

输入描述:
第一行包含一个整数N,1≤N≤10^5。
第二行包含N个空格隔开的整数A_1到A_N,0≤A_i≤10^4。

输出描述:
输出完成计划所需的最少天数。

思路一:贪心法(AC)

1 if __name__ == '__main__':
2     N = int(input())
3     ary = list(map(int,input().strip().split()))
4     cnt = 0
5     for i in range(1,N):
6         if ary[i-1] > ary[i]:
7             cnt += ary[i-1] - ary[i]
8     print(cnt + ary[N-1])

 

思路二:分治法(只能通过60%)

 1 def findMinIndex(ary):
 2     minValue = sys.maxsize
 3     minIndex = -1
 4     for i in range(len(ary)):
 5         if ary[i] < minValue:
 6             minValue = ary[i]
 7             minIndex = i
 8     for i in range(len(ary)):
 9         ary[i] -= minValue
10     return ary,minIndex,minValue
11 
12 def calFlowers(ary,L,R):
13     if L == R:
14         return ary[L]
15     elif L < R:
16         ary2,minI,minV = findMinIndex(ary[L:R+1])
17         left = calFlowers(ary2,0,minI-1)
18         right = calFlowers(ary2,minI+1,len(ary2)-1)
19         return left + right + minV
20     else:
21         return 0
22         
23 if __name__ == '__main__':
24     N = int(input())
25     ary = list(map(int,input().strip().split()))
26     
27     result = calFlowers(ary,0,N-1)
28     print(result)

 

转载于:https://www.cnblogs.com/asenyang/p/11100600.html

你可能感兴趣的:(校招真题练习011 种花(美团))