解题思路
关键发现:
- 相邻花园之间的落差决定了需要的天数
- 如果当前花园比下一个花园的花多,这个差值就是需要单独种的天数
- 所有这样的差值之和就是总天数
代码
#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()
算法及复杂度
- 算法:贪心
- 时间复杂度:,其中 是花园数量
- 空间复杂度:,只需要常数额外空间