P2096 最佳旅游线路(洛谷)
逻辑:从左到右分别找到每列的最大值累加即可,但需要考虑是否从最左边列开始、是否在最右边列停止
第一次未考虑 可以不从最左边开始,因此只得了八十分。重新思考过后存在可以不从最左边开始的可能性,重新书写代码后AC该题
第一次得分:80
import java.util.Arrays;
import java.util.Scanner;
public class P2096 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt(); // 行 1≤m≤100
int n = sc.nextInt(); // 列 1≤n≤20001
int[][] arr = new int[m][n]; // 创建二维数组接收数据
for (int i = 0; i < m; i++) { // 喜闻乐见的读入数据部分
for (int j = 0; j < n; j++) {
arr[i][j] = sc.nextInt();
}
}
int[] arr1 = new int[m]; // 存储每列数字,用于寻找列最大值
int[] sum = new int[n]; // 记录累计和,排序后找到最佳总分值
int total = 0; // 累加和
for (int j = 0; j < n; j++) {
for (int i = 0; i < m; i++) {
arr1[i] = arr[i][j]; // 向arr1放入列数据
}
Arrays.sort(arr1); // 排序列值的顺序
total += arr1[m - 1];
sum[j] += total;
}
Arrays.sort(sum); // 对sum进行排序,准备得出最后结果
System.out.println(sum[n - 1]);
}
}
第二次得分:100
添加index数组进行辅助判断,循环中加判断即可
import java.util.Arrays;
import java.util.Scanner;
public class P2096 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt(); // 行 1≤m≤100
int n = sc.nextInt(); // 列 1≤n≤20001
int[][] arr = new int[m][n]; // 创建二维数组接收数据
for (int i = 0; i < m; i++) { // 喜闻乐见的读入数据部分
for (int j = 0; j < n; j++) {
arr[i][j] = sc.nextInt();
}
}
int[] arr1 = new int[m]; // 存储每列数字,用于寻找列最大值
int[] sum = new int[n]; // 记录累计和,排序后找到最佳总分值
// 标记前一列的数据是否最大值为负数,如果从开头连续的最大值都是0<=的值,前面几列全部标记列最大值为0,不参与后续计算。用于确定从左边哪一列开始
// index数组中:标记0是正数,1是负数
int[] index = new int[n];
int total = 0; // 累加和
for (int j = 0; j < n; j++) {
for (int i = 0; i < m; i++) {
arr1[i] = arr[i][j]; // 向arr1放入列数据
}
Arrays.sort(arr1); // 排序列值的顺序
// 这个判断用于标记是否从前几列开始的最大值<=0
if (arr1[m - 1] <= 0 && j != 0 && index[j - 1] == 1) {
arr1[m - 1] = 0;
index[j] = 1;
} else if (arr1[m - 1] <= 0 && j == 0) {
arr1[m - 1] = 0;
index[j] = 1;
}
total += arr1[m - 1];
sum[j] += total;
}
Arrays.sort(sum); // 对sum进行排序,准备得出最后结果
System.out.println(sum[n - 1]);
}
}
简单刷题,不足之处,请留言指教