美团点评2019校招真题——种花

题目描述

公园里有 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。

输出描述

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

示例1

输入

5
4 1 8 2 5

输出

14

解答过程:

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] Ai = new int[n];
        for(int i=0; i<n; i++){
            Ai[i]=sc.nextInt();
        }
        int sum = 0;
        for(int i=1; i<n; i++){
            if(Ai[i-1]>Ai[i]){
                sum += Ai[i-1]-Ai[i];
            }
        }
        System.out.println(sum+Ai[n-1]);
    }
}

笔记

如示例给出N为5,则有5个花园,每个花园总需要种的花朵为[4,1,8,2,5]
园丁每天每个区间的每个花园里只能种一朵花,为了得到园丁至少要花多少天才能种完花朵。这里我们定义个数组Ai,将每个花园需要种的花朵存放进来,数组元素的多少就是花园个数。
理解以下代码:

int sum = 0;
        for(int i=1; i<n; i++){
            if(Ai[i-1]>Ai[i]){
                sum += Ai[i-1]-Ai[i];
            }
        }

如 i=1 那么,就是 Ai[0] 与 Ai[1] 做比较,很明显4>1,则4-1=3就是园丁种植第一个花园的天数,3天在第一个花园里就种了3朵。此时数组就变成了[ 1,1,8,2,5 ],再来比较 Ai[1] 与 Ai[2] 不满足条件,继续执行代码。以此类推,比较 Ai[3] 与 Ai[4] 大小,需要种6天,[1,1,2,2,5],再看已经没有满足条件的结果了。因此最后一个花园需要种5个花朵,每天种一朵,之后每天都为每一个花园种1朵花朵,直到每个花园的花朵都种完,哈哈哈,5天就能把所有花园的花朵都种完啦。因此将天数加起来:3+6+5=14天。这就是最终答案啦~~~~

你可能感兴趣的:(美团点评2019校招真题——种花)