CF -- Educational Codeforces Round 158 (Rated for Div. 2) -- D 补题记录

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 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);

    }

}

你可能感兴趣的:(算法)