第一题:P1115 最大子段和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
package 蓝桥算法训练__普及组.Day4;
import java.util.Scanner;
/**
* @author snippet
* @data 2023-02-08
* P1115 最大子段和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
*/
public class T1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n+1];
int[] dp = new int[n+1];
for (int i = 1; i <= n; i++) {
a[i] = sc.nextInt();
}
int ans = a[1];
dp[1] = a[1];
for (int i = 2; i <= n; i++) {
dp[i] = Math.max(a[i], dp[i-1]+a[i]);
ans = Math.max(ans, dp[i]);
}
System.out.println(ans);
}
}
![](https://img-blog.csdnimg.cn/img_convert/06276748ed2772a6ad0d454783f8ea12.png)
第二题:P1678 烦恼的高考志愿 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
package 蓝桥算法训练__普及组.Day4;
import java.util.Arrays;
import java.util.Scanner;
/**
* @author snippet
* @data 2023-02-08
* P1678 烦恼的高考志愿 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
*/
public class T2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();// 学校数
int n = sc.nextInt();// 学生数
int[] a = new int[m+1];
int[] b = new int[n+1];
long ans = 0;
for (int i = 1; i <= m; i++) {
a[i] = sc.nextInt();
}
for (int i = 1; i <= n; i++) {
b[i] = sc.nextInt();
}
Arrays.sort(a,1,m+1);
// 每个学生进行选取一次
// 就是每个学生进行一次二分选取
for (int i = 1; i <= n; i++) {
int left = 1;
int right = m;
while (left < right) {
int mid = left + right >> 1;
if (b[i] >= a[mid]) {
left = mid+1;
} else {
right = mid;
}
}
if (b[i] >= a[1]) {
ans += Math.min(Math.abs(b[i]-a[left]), Math.abs(b[i]-a[left-1]));
} else {
// 特判学生的分数小于所有学校录取分数的时候
// 因为比较是 下标left的学校和下标left-1的学校做对比
// 当left为1时 也就是学生的参加小于所有学校的录取分数
// 如果还是使用 Math.min(Math.abs(b[i]-a[left]), Math.abs(b[i]-a[left-1]))
// 则会影响答案结果
ans += a[1]-b[i];
}
}
System.out.println(ans);
}
}
![](https://img-blog.csdnimg.cn/img_convert/4fe9791cda54ec7d116150747dcbe684.png)
第三题:P1873 [COCI 2011/2012 #5] EKO / 砍树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
package 蓝桥算法训练__普及组.Day4;
import java.util.Scanner;
/**
* @author snippet
* @data 2023-02-08
* P1873 [COCI 2011/2012 #5] EKO / 砍树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
*/
public class T3 {
static int n,m;
static int N = 1000100;
static int[] a = new int[N];
// 判断当截取数的高度为mid时 所能得到的树的长度
static boolean check(int mid) {
long sum = 0;
for (int i = 1; i <= n; i++) {
if (a[i] > mid) {
sum += a[i] - mid;
}
}
//System.out.println(sum);
if (sum >= m) {
return true;
} else {
return false;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
for (int i = 1; i <= n; i++) {
a[i] = sc.nextInt();
}
int left = 1;
int right = (int)1e9;
while (left < right) {
int mid = left + right + 1 >> 1;
if (check(mid)) {
left = mid;
} else {
right = mid - 1;
}
}
System.out.println(left);
}
}
![](https://img-blog.csdnimg.cn/img_convert/2706afe8c8ab93320bef14624e5b824a.png)
package 蓝桥算法训练__普及组.Day4;
import java.util.Scanner;
/**
* @author snippet
* @data 2023-02-08
* 519. 跳石头 - AcWing题库
*/
public class T4 {
static int l,n,m;
static int N = 50050;
static int[] a = new int[N];
// 判断当距离为mid时 移走的岩石的数量是否满足条件
static int check(int mid) {
// last是终止位置 count是移除的石头的数量
int last = 0, count = 0;
for (int i = 1; i <= n; i++) {
if (a[i] - last < mid) {
count++;
} else {
last = a[i];
}
}
return count;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
l = sc.nextInt();
n = sc.nextInt();
m = sc.nextInt();
for (int i = 1; i <= n; i++) {
a[i] = sc.nextInt();
}
// 注意:要把整个石头路的长度记录下来
a[++n] = l;
int left = 1;
int right = (int) 1e9;
while (left < right) {
int mid = left + right + 1 >> 1;
if (check(mid) <= m) {
left = mid;
} else {
right = mid - 1;
}
}
System.out.println(left);
}
}
![](https://img-blog.csdnimg.cn/img_convert/3ce19a088b71b1ffe7bb3fb52f3b6528.png)