打气球算法超时问题求助

aixbonbon 2024-10-26 10:10:10

请问各位老师,以下程序,我做了2种方法。但是都说超时。请老师们帮帮忙,谢谢。

现在在一个二维平面上,有n个气球,这些气球被栓在 x1=1,x2=2,....xn=n的位置,他们的高度分别为y1,y2,y3...yn现在有一把神奇的神奇的手枪,每次只能站在 x=0的位置,并且选择一条平行于x轴的方向开枪, 子弹在飞行的过程中,如果遇到了气球,该子弹会将该气球打爆,由于气球里面的气体该子弹会 降低一个单位(y坐标由 temp 变为temp-1),并且依然平行于x轴继续飞行.
现在想知道,最少需要几发子弹可以打爆在场的所有气球

输入描述

第一行一个整数n表示气球的个数.
第二行n个整数y1,y2...y3表示第i个气球的y坐标.

输出描述

需要的最少子弹.

样例1

输入复制

3

3 2 1

输出

1

样例2

输入复制

4

1 2 3 4

输出

4

提示

样例解释

对于样例1,我们只需要在 x = 0 , y = 3的位置发射一枚子弹,

子弹到x=1的位置时,会打爆第1个气球,此时的y坐标会-1,此时 子弹的y坐标为2

子弹到x=2的位置时,会打爆第2个气球,此时的y坐标会-1,此时 子弹的y坐标为1

子弹到x=3的位置时,会打爆第3个气球,此时y的坐标会-1,此时 子弹的y坐标为0

此时所有的气球都被打爆了
所以答案为1;

对于样例2: 由于气球是递增的,所以我们是没有办法用一枚子弹去打爆多枚子弹.所以我们这里气球的个数就是答案的个数.

数据范围

对于40%的数据: yi严格递增或者递减.
对于100%的数据有:1<=n<=100000,1<=yi<=1000000000

 

我的第一个方法如下:

#include <bits/stdc++.h>
using namespace std;

int main()
{
    long long bn = 0;
    cin >> bn; // 读取气球的个数
    vector<long long> bullets; // 存储每颗子弹的当前高度
    while (bn--)
    {
        long long a = 0;
        cin >> a; // 读取第i个气球的高度
        bool hit = false; // 标记是否有子弹能打到当前气球
        for (long long j = 0; j < bullets.size(); j++) // 遍历所有子弹
        {
            // 如果这颗子弹能打到这个气球
            if (bullets[j] - 1 == a)
            {
                bullets[j]--; // 子弹高度降低
                hit = true; // 标记为已命中
                break; // 退出循环,因为已经有子弹打到气球了
            }
        }
        // 如果没有子弹能打到当前气球
        if (hit==0)
        // 新增一颗子弹,并将其高度设置为当前气球的高度
        bullets.push_back(a);
    };cout << bullets.size() << endl; // 输出需要的最少子弹数量
}

 

我又从气球角度编了一段程序,如下:

//下列头文件已自动加好:
#include <bits/stdc++.h>
using namespace std;

int main()
{
	long long bn=0;
	cin >> bn;
	vector<int> ballon(bn);
	int addcount=0;
    for(long long i=0;i<bn;i++)
    {
    	cin >> ballon[i];
    	if(i && ballon[i]>ballon[i-1])addcount++;//判断是否全递增
   	}
    if(addcount==ballon.size()-1)
	{
	cout << ballon.size();
	return 0;
	}//直接输出气球个数
    int sum=0;int i=0;
    while(ballon.size())
    {
        int bulletheight=ballon[0];
        bulletheight--;
        for(int i=1;i<ballon.size();)
	    {
		    if(ballon[i]==bulletheight)//打中了
		    {
		    ballon.erase(ballon.begin()+i);//打中则销号
		    bulletheight--;//子弹降低高度
		    }
	        else i++;//没打中,继续找一个可以打中的气球
	    }
        sum++;
        ballon.erase(ballon.begin());
	}
     cout << sum << endl;
}

 

...全文
68 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

你的算法本身就有问题,应该每次打最高的那个气球,而且还得对40%的数据进行优化。

69,716

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧