愤怒的奶牛

前言
“雨说天空会流泪,咖啡说生活要习惯苦味,我说人活着简直就是受罪。”欢迎来到嘟嘟课堂。今天,我们来讲一道暴力题——愤怒的奶牛。
题目描述
F 奶牛 Bessie 设计出了一个热门电玩游戏“愤怒的奶牛”。玩家用弹弓弹射一头牛,目标是前方一排位于数字线上不同点的干草包; 奶牛撞击干草后能产生足够的能量使干草包爆炸,干草包爆炸后又可能造成连锁反应,导致附近的干草包爆炸。任务是用一头牛轰击干草包,让干草包连锁反应,并且尽可能多的引爆干草包。
有 n 捆位于不同整数位置 X1,X2,… Xn 的干草。一开始如果奶牛撞击位于 x 位置上的干草包,那么 x 位置上的干草就会被引爆,并且这个干草包爆炸的“爆炸半径”为 1,这意味着任何其他干草包在一个单位的距离内也被引爆。然后这些相邻的包子自身爆炸同事也会引爆它边上的干草,每个爆炸半径都为 2,所以这些爆炸可能会将另外相距最多 2 个距离的未爆炸的干草继续引爆。在下一个时间步骤中,这些包也会以引爆半径 3 来引爆其它干草。每增加一次连锁爆炸,那么引爆半径就增加 1.
你的任务就是确定奶牛应该撞击哪个干草包,最后能引爆最多的干草包。、
输入
第一行一个整数 n 表示有多少干草包(1 ≤ n≤100)。
接下来 n 行每行一个整数,表示干草包的位置 x。(0≤x≤1000000000)
输出
输出一个数,表示奶牛最多能引爆的干草包数量。
样例输入
6
8
5
6
13
3
4
样例输出
5
样例说明
奶牛撞击 5 号干草包,接着将导致 4 号和 6 号的包爆炸,再接着引爆半径 2。这些爆炸反过来又导致 3 号和 8 号的包爆炸,但这些最后的爆炸力不够强大,无法到达 13 号包。
思路
本题纯属暴力。这些炸弹包会发生连锁反应。一头奶牛(胡晟智)向一个干草包(高珏颐)撞过去(啊!!!高姐保重!!!),干草包就会爆炸(胡晟智英勇牺牲),还会发生连锁反应(胡晟智觉得一个女生还不够,要多几个更好玩)。
应为数据不大(1..100),所以这题我们就来枚举。枚举一个干草包,然后将它左边和右边的干草包能搞爆的就搞爆。最后算出最大的答案就行了。
代码

var
        a:array[1..100] of longint;
        i,j,k,n,l,r,ls,rs,kpz,max,sb1,sb2:longint;
        p,pp:boolean;
begin
        readln(n);
        for i:=1 to n do
                readln(a[i]);
        for i:=1 to n-1 do
        begin
                for j:=i+1 to n do
                begin
                        if (a[i]>a[j]) then
                        begin
                                kpz:=a[i];
                                a[i]:=a[j];
                                a[j]:=kpz;
                        end;
                end;
        end;
        for i:=1 to n do
        begin
                sb1:=i;
                sb2:=i;
                ls:=1;
                rs:=1;
                l:=0;
                r:=0;
                repeat
                        p:=false;
                        while (i-l-1>0) and (a[sb1]-a[i-l-1]<=ls) do
                        begin
                                inc(l);
                                p:=true;
                        end;
                        inc(ls);
                        sb1:=i-l;
                until p=false;
                repeat
                        pp:=false;
                        while (i+r+1<=n) and (a[i+r+1]-a[sb2]<=rs) do
                        begin
                                inc(r);
                                pp:=true;
                        end;
                        inc(rs);
                        sb2:=i+r;
                until pp=false;
                if (l+r+1>max) then max:=l+r+1;
        end;
        writeln(max);
end.
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值