题目描述
公园里有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)