タイトル説明
パークNは庭園があり、それぞれが最初は花、庭の庭師を持っていない庭は1からNまで数えますと、私は花をa_iを庭の計画の番だけの種類、彼は毎日区間[L]を選択します庭師は、プロジェクトを完了するために、少なくとも何日かかるので、R](1≤L≤R≤N)とは、花の様々な庭でRにL番号を付け?
入力説明:
最初の行は、整数N、1≤N≤10^ 5を含んでいます。
2行目はA_N、0≤A_i≤10^ 4にN、スペースで区切られた整数A_1を含有します。
出力説明:
出力はプログラムのために必要な最小日数を完了します。
思考:貪欲(AC)
1 なら __name__ == ' __main__ ' : 2 N = INT (入力()) 3 進=リスト(マップ(INT 。。、入力()ストリップ()スプリット())) 4 CNT = 0 5 ための I における範囲(1 、N): 6 場合進[I- 1 ]> 進[I]: 7 進CNT + =は[I- 1 ] - [I] ARY 8 プリント(CNT +進[N- 1 ])
2考える:分割統治(のみ60%)
1 DEF findMinIndex(進): 2 のminValue = sys.maxsize 3 minIndex = - 1 4 のための I における範囲(LEN(進)): 5 であれば、[I] <進のminValue: 6 のminValue = 進[i]は 7 minIndex = iは 8 用の I における範囲(LEN(進)): 9 進[I] - = のminValue 10 リターン進、minIndex、のminValue 11 12 DEF calFlowers(進、L、R): 13 であれば L == R。 14 リターン進[L] 15 ELIFのL < R: 16 ARY2、ミニ、MINV = findMinIndex(進[L:R + 1 ]) 17 左= calFlowers(ARY2、0、ミニ1 ) 18 右= calFlowers(ARY2、ミニ+ 図1は、LEN(ARY2)は- 1 ) 19 リターン +右+左MINVを 20 他: 21 リターン 0 22 23 なら __name__ == ' __main__ ' : 24 N = INT (入力())を 25 進=リスト(マップ(INT 、入力()。ストリップ()。スプリット())) 26 27 結果= calFlowers(進、0、N- 1 ) 28 プリント(結果)