题目
奶牛贝茜设计了一款她认为必火的游戏:愤怒的奶牛。
游戏设定(她坚信这是她的原创)是玩家用一个弹弓将一头奶牛射向一个数轴,数轴的不同位置上分布着一些干草捆。
奶牛以足够的力量砸向某个干草捆,并使得该干草捆发生爆炸,爆炸可能会不断引起连锁反应,导致更多的干草捆发生爆炸。
目标是用一头奶牛引起的连锁反应引爆尽可能多的干草捆。
共有 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);
}
}