69,716
社区成员
请问各位老师,以下程序,我做了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坐标.
需要的最少子弹.
输入复制
3
3 2 1
输出
1
输入复制
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;
}
你的算法本身就有问题,应该每次打最高的那个气球,而且还得对40%的数据进行优化。