愤怒的奶牛


题目

链接:1855. 愤怒的奶牛 - AcWing题库

奶牛贝茜设计了一款她认为必火的游戏:愤怒的奶牛。

游戏设定(她坚信这是她的原创)是玩家用一个弹弓将一头奶牛射向一个数轴,数轴的不同位置上分布着一些干草捆。

奶牛以足够的力量砸向某个干草捆,并使得该干草捆发生爆炸,爆炸可能会不断引起连锁反应,导致更多的干草捆发生爆炸。

目标是用一头奶牛引起的连锁反应引爆尽可能多的干草捆。

共有 N 个干草捆位于数轴中的不同整数位置,其坐标依次为 x1,x2,…,xN

如果将奶牛射向位于位置 x 的干草捆,则该干草捆发生爆炸,爆炸半径为 1,爆炸将吞噬 1 单位距离内的所有干草捆。

然后这些干草捆(全部同时)发生爆炸,每个干草捆的爆炸半径为 2

二次爆炸中吞噬的所有尚未爆炸的干草捆也(全部同时)发生爆炸,爆炸半径为 3

也就是说,在 t 时刻爆炸的干草捆的爆炸半径为 t,其爆炸波及的干草捆在 t+1 时刻也会爆炸,爆炸半径为 t+1,以此类推。

请确定,通过合理选择奶牛射向的干草捆,能够引爆的干草捆最大数量。

代码

import java.util.*;


public class Main {
    static int N = 100010;
    static int n, ans = 0;
    static int[] a = new int[110];
    public static int bfsl(int i, int len)
    {
        if(i <= 1)
            return 0;
        int tl = 0 ;
        int j = i - 1 ;
        while(j > 0&& a[i] - a[j] <= len)
        {
            j --;
            tl ++;
        }
        if(tl == 0)
            return 0;
        tl += bfsl(j + 1, len + 1);
        return tl;
    }
    public static int bfsr(int i, int len)
    {
        if(i >= n)
            return 0;
        int tr = 0 ;
        int j = i + 1 ;
        while(j <= n&& a[j] - a[i] <= len)
        {
            j ++;
            tr ++;
        }
        if(tr == 0)
            return 0;
        tr += bfsr(j - 1, len + 1);
        return tr;
    }
    public static void main(String[] args) {
        Scanner inScanner = new Scanner(System.in);
        n = inScanner.nextInt();
        for(int i = 1; i <= n; i ++)
            a[i] = inScanner.nextInt();
        inScanner.close();
        Arrays.sort(a, 1, n + 1);
        for(int i = 1; i <= n; i ++)
        {
            int l = bfsl(i, 1);
            int r = bfsr(i, 1);
            ans = Math.max(ans, l + r + 1);
        }
        System.out.println(ans);
    }
}

文章作者: 姜小白
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 姜小白 !
评论
  目录