爆气球 电子学会等级考试三级 2024

爆气球

爆气球对孩子们来说是很好玩的游戏。假设有n只气球被布置在一条直线上,游戏的目标很简单,就是爆掉尽可能多的气球。但是这里我们加一条特殊的规则 --你只能跳一次。我们假设聪明的娃穿了件浑身带刺的衣服,跳到某个位置,躺平,这样气球只要碰到娃身体的任何部分都会立刻爆炸。那么你的任务就是告诉娃应该跳到哪里,才能一次爆掉最多的气球。

时间限制:4000

内存限制:262144

输入

输入第一行两个正整数:n(≤105)为一条线上布置的气球的数量;h(≤ 10³)为孩子伸直双臂能达到的高度。第二行给出n个整数,每个对应一只气球在直线轴上的坐标。题目保证坐标按递增顺序给出,所有坐标值在[-106,106] 区间内。

输出

在一行中输出孩子跳跃的位置坐标,使得孩子跳到这个位置然后躺平能够爆掉身下最多的气球;随后输出能爆掉的气球的最大数量。如果这个坐标不唯一,输出最小的那个值。一行中的数间应有1个空格。

样例输入

11 120

-120 -40 080122 140 160 220 240260 300

样例输出

1205

提示

注意:跳到从 120 到140,或 240到260之间的任何位置,都可以爆掉5只气球,所以120作为最小的坐标被输出。

爆气球 电子学会等级考试三级 2024_第1张图片

解题分析

1 一共几个气球要输入     身长要输入

2 每个气球的位置要输入

 从第一个气球a[1] 开始,从a[1]的位置,量一下身长,能压破几个气球,记录一下S1。

然后从第二个气球a[2]开始,从a[2]的位置,量一下身长,能压破几个气球,记录一下S2。

然后从第i个气球a[i]开始,从a[i]的位置,量一下身长,能压破几个气球,记录一下Si。

一直到最后一个气球a[n],从a[n]的位置,量一下身长,能压破几个气球,记录一下(最后一个气球,只能压爆一个,就是自己)。

找出最大的Si 输出 然后找到最后一个气球,减去身长,就是开始位置。

程序代码如下:

#include
using namespace std;
int a[100010];
int main()
{
    int n,l;
    cin>>n>>l;//l是身长 
    int m;  //为了爆气球,张开身体,最后能到达的位置 
    int s=0;//对于每一个气球作为起点,最多爆炸几个气球 
    int sum=0;//所有点中间,爆炸气球最多的数量 
    int start;//起点 
    int end;//结束点,最后一个爆气球的地方 
    int total=-1;
    for(int i=1;i<=n;i++) //输入每个气球的位置 
    {
        cin>>a[i];
    }
    for(int i=1;i<=n;i++)
    {   s=0;//每一个气球作为起点开始,记录能爆几个气球 
        m=a[i]+l;//最后能到达的位置 
        start=i;
        while(start<=n&&a[start]<=m)
        {
            if(a[start]>=a[i])
            {
                s=s+1;//记录爆炸几个气球 
            }                
            start=start+1;  //最后一次也加一了 
        }
        if(s>sum)
        {
            sum=s;
            end=start-1;//因为最后一次加一了 
        }        
        
    }
    cout<     return 0;
}

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