该文章为《挑战程序设计竞赛2 算法和数据结构》第二章的题解笔记,该书主要借助AizuOnlineJudge(以下简称AOJ)上的课程题进行讲解。
ALDS1_1_D Maximum Profit(最大利润)
目录
[ALDS1_1_D Maximum Profit(最大利润)](#ALDS1_1_D Maximum Profit(最大利润))
题目描述(图片内容为机翻)
代码实现
java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int max, min, max_x;
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int a[] = new int[n];
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
max = a[n - 1];
min = a[0];
max_x = max - min;
for (int j = 1; j < n; j++) {
max_x = Math.max(a[j] - min, max_x);
min = Math.min(min, a[j]);
}
System.out.println(max_x);
sc.close();
}
}
题解笔记
总评
题目难度不大,但要求较多,有点绕,需细心思考。
该题重点在于找出局部的最大值和最小值,按照题目要求最大的价格差即极大值-极小值(不一定为最大值-最小值),需要从局部观察,不能直接按整体找。
注意点
- 输出有顺序要求的价格差的最大值,需要后面的数减去前面的数。顺序很重要,不是单纯找出整个数列的最大值、最小值作差。
- 注意递减的情况,找最大值和最小值时候要注意端点,最大值不能为第一个数,最小值不能为最后一个数。
- 该题要有局部观,不能从整体来看,不要直接从前往后找出最小值后再找出该值后面的最大值,或从后往前先找出最大值后再找该值前面的最小值,要算出每个局部价格差的最大值。
重点解释
从前往后,找出局部的最大价格差,并且更新截止当前的最小值,即找到当前的极小值点,计算出价格差(a[j]-min)后,与之前的最大价格差比较(max_x),最后更新最大价格差。