0
点赞
收藏
分享

微信扫一扫

愤怒的奶牛(寒假每日一题 21)

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

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

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

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

共有 愤怒的奶牛(寒假每日一题 21)_bfs 个干草捆位于数轴中的不同整数位置,其坐标依次为 愤怒的奶牛(寒假每日一题 21)_思维题_02

如果将奶牛射向位于位置 愤怒的奶牛(寒假每日一题 21)_dfs_03 的干草捆,则该干草捆发生爆炸,爆炸半径为 愤怒的奶牛(寒假每日一题 21)_dfs_04,爆炸将吞噬 愤怒的奶牛(寒假每日一题 21)_dfs_04 单位距离内的所有干草捆。

然后这些干草捆(全部同时)发生爆炸,每个干草捆的爆炸半径为 愤怒的奶牛(寒假每日一题 21)_算法_06

二次爆炸中吞噬的所有尚未爆炸的干草捆也(全部同时)发生爆炸,爆炸半径为 愤怒的奶牛(寒假每日一题 21)_bfs_07

也就是说,在 愤怒的奶牛(寒假每日一题 21)_枚举_08 时刻爆炸的干草捆的爆炸半径为 愤怒的奶牛(寒假每日一题 21)_枚举_08,其爆炸波及的干草捆在 愤怒的奶牛(寒假每日一题 21)_思维题_10 时刻也会爆炸,爆炸半径为 愤怒的奶牛(寒假每日一题 21)_思维题_10,以此类推。

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

输入格式
第一行包含整数 愤怒的奶牛(寒假每日一题 21)_bfs

接下来 愤怒的奶牛(寒假每日一题 21)_bfs 行包含 愤怒的奶牛(寒假每日一题 21)_算法_14

输出格式
输出能够引爆的干草捆的最大数量。

数据范围
愤怒的奶牛(寒假每日一题 21)_枚举_15

输入样例:

6
8
5
6
13
3
4

输出样例:

5

样例解释
将奶牛射向位于位置 5 的干草捆,产生半径为 1 的爆炸。

爆炸吞噬位置 4 和 6 处的干草捆,引发半径为 2 的二次爆炸。

二次爆炸吞噬位置 3 和 8 处的干草捆,引发半径为 3 的三次爆炸。

位置 13 的干草捆无法被引爆。

愤怒的奶牛(寒假每日一题 21)_算法_16愤怒的奶牛(寒假每日一题 21)_dfs_17 也可以解此题!

枚举思路:
遍历每个点作为起点,在处理一各点作为起点的爆炸中,将每次爆炸半径相同的作为同等级,每次找出同等级最边上的那个,然后再对最边上的进行处理即可!

左边 愤怒的奶牛(寒假每日一题 21)_dfs_18 半径为:愤怒的奶牛(寒假每日一题 21)_枚举_19
右边 愤怒的奶牛(寒假每日一题 21)_算法_20 半径为:愤怒的奶牛(寒假每日一题 21)_dfs_21

愤怒的奶牛(寒假每日一题 21)_bfs_22

#include<iostream>
#include<algorithm>

using namespace std;

const int N = 110, INF = 2e9;

int q[N];

int main(){

int n;
cin >> n;

q[0] = -INF, q[n + 1] = INF;
for(int i = 1; i <= n; i++) cin >> q[i];

sort(q + 1, q + 1 + n);

int res = 0;
for(int i = 1; i <= n; i++){

int l = 1, r = 1, a = i, b = i;
while(q[a] - q[a - 1] <= l){

int k = a - 1;
while(q[a] - q[k - 1] <= l) k--;
a = k;
l++;
}
while(q[b + 1] - q[b] <= r){

int k = b + 1;
while(q[k + 1] - q[b] <= r) k++;
b = k;
r++;
}
res = max(res, b - a + 1);
}

cout << res << endl;

return 0;
}


举报

相关推荐

0 条评论