解题思路

关键发现:

  1. 相邻花园之间的落差决定了需要的天数
  2. 如果当前花园比下一个花园的花多,这个差值就是需要单独种的天数
  3. 所有这样的差值之和就是总天数

代码

#include <iostream>
#include <vector>
using namespace std;

class FlowerGarden {
public:
    static int calculateMinDays(int n, vector<int>& flowers) {
        // 添加哨兵,避免边界判断
        flowers.push_back(0);
        
        // 计算相邻花园的正差值之和
        int totalDays = 0;
        for (int i = 0; i < n; i++) {
            int diff = flowers[i] - flowers[i + 1];
            if (diff > 0) {
                totalDays += diff;
            }
        }
        
        return totalDays;
    }
};

int main() {
    // 快速输入
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    // 读取输入
    int n;
    cin >> n;
    vector<int> flowers(n);
    for (int i = 0; i < n; i++) {
        cin >> flowers[i];
    }
    
    // 计算并输出结果
    cout << FlowerGarden::calculateMinDays(n, flowers) << endl;
    
    return 0;
}
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        // 读取输入
        int n = sc.nextInt();
        int[] flowers = new int[n + 1];
        for (int i = 0; i < n; i++) {
            flowers[i] = sc.nextInt();
        }
        flowers[n] = 0;  // 添加末尾0
        
        // 计算所有正的差值之和
        int result = 0;
        for (int i = 0; i < n; i++) {
            result += Math.max(0, flowers[i] - flowers[i + 1]);
        }
        
        System.out.println(result);
    }
}
import java.util.*;

public class Main {
    static class FlowerGarden {
        /**
         * 计算完成种花计划所需的最少天数
         * 
         * @param n 花园数量
         * @param flowers 每个花园需要种的花的数量数组
         * @return 完成计划所需的最少天数
         */
        public static int calculateMinDays(int n, int[] flowers) {
            // 计算相邻花园的正差值之和
            int totalDays = 0;
            for (int i = 0; i < n; i++) {
                int diff = flowers[i] - (i == n-1 ? 0 : flowers[i + 1]);
                if (diff > 0) {
                    totalDays += diff;
                }
            }
            return totalDays;
        }
    }
    
    public static void main(String[] args) {
        // 读取输入
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] flowers = new int[n];
        for (int i = 0; i < n; i++) {
            flowers[i] = sc.nextInt();
        }
        
        // 计算并输出结果
        System.out.println(FlowerGarden.calculateMinDays(n, flowers));
        
        sc.close();
    }
}
def calculate_min_days(n: int, flowers: list) -> int:
    """
    计算完成种花计划所需的最少天数
    
    Args:
        n: 花园数量
        flowers: 每个花园需要种的花的数量列表
    
    Returns:
        完成计划所需的最少天数
    """
    # 添加哨兵,避免边界判断
    flowers.append(0)
    
    # 计算相邻花园的正差值之和
    total_days = 0
    for i in range(n):
        diff = flowers[i] - flowers[i + 1]
        if diff > 0:
            total_days += diff
            
    return total_days

def main():
    # 读取输入
    n = int(input())
    flowers = list(map(int, input().split()))
    
    # 计算并输出结果
    result = calculate_min_days(n, flowers)
    print(result)

if __name__ == "__main__":
    main()

算法及复杂度

  • 算法:贪心
  • 时间复杂度:,其中 是花园数量
  • 空间复杂度:,只需要常数额外空间