Yet Another Monster Fight
题目大意:
现在给你一堆怪物,你拥有法术(一个法术可以连续攻击这n个所有怪物),你可以选择任意一个怪物作为法术的第一个攻击目标(伤害为x),然后除了第一个攻击目标可以任意,其他攻击目标只能为曾经攻击目标的相邻怪物。然后伤害依次递减,x x-1 x-2 ......如果伤害大于等于怪物的血量,则怪物被击杀。
现在你第一次攻击目标一定是最优的,问你最坏情况下,x需要多少才能一次法术把所有怪物击杀完毕。
思路解析:(红色的为正确思路)
因为只能攻击曾经攻击过的相邻怪物。则攻击第i个怪物,你应该攻击过第i-1个怪物,或者第i+1个怪物,最坏情况下应该是 前i-1个怪物全部攻击过和 第i个怪物之后(不包括第i个怪物)都攻击过。所以我们应该枚举那个怪物为最开始的攻击目标,然后在每个怪物作为开始的攻击目标的最坏情况下求最好情况,则就是我们需要的答案。
但是我比赛的时候傻了,我没想到枚举,我以为以最大值作为开始攻击目标一定是最好的,因为样例是这样的。(但是有可能出现不是的情况)。
如果以7作为第一次的攻击目标,答案为12, 但是以蓝色的6作为第一次的攻击目标答案为11.
代码实现:
import java.util.ArrayList;
import java.util.Scanner;
/**
* @ProjectName: study3
* @FileName: Ex22
* @author:HWJ
* @Data: 2023/11/24 23:16
*/
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int max = 0;
ArrayList<Integer> list = new ArrayList<>();
int n = input.nextInt();
int[] arr = new int[n];
int[] a = new int[n];
int[] b = new int[n];
int[] c = new int[n + 1];
int ans = Integer.MAX_VALUE;
for (int i = 0; i < n; i++) {
arr[i] = input.nextInt();
a[i] = arr[i] + i;
b[i] = arr[i] + n - i - 1;
}
c[n] = 0;
for (int i = n - 1; i > 0; i--) {
c[i] = Math.max(c[i + 1], a[i]);
}
int cur = 0;
for (int i = 0; i < n; i++) {
if(i > 0){
cur = Math.max(cur, b[i - 1]);
}
int res = Math.max(cur, c[i + 1]);
res = Math.max(res, arr[i]);
ans = Math.min(res, ans);
}
System.out.println(ans);
}
}