Yet Another Monster Fight
Problem - D - Codeforces
题目大意:
现在给你一堆怪物,你拥有法术(一个法术可以连续攻击这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);}}