蓝桥杯 算法训练 拦截导弹

算法训练 拦截导弹  
时间限制:1.0s   内存限制:256.0MB
问题描述
  某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

  输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
输入格式
  一行,为导弹依次飞来的高度
输出格式
  两行,分别是最多能拦截的导弹数与要拦截所有导弹最少要配备的系统数
样例输入
389 207 155 300 299 170 158 65
样例输出
6
2

这个题我写了两种算法,可能许多人会把拦截导弹和用多少设备联系在一起,我的做法是把他们 分开来算。
用一个递归来找出 一个设备能拦截的最大导弹数,即调用函数的max就是统计的数量。
另一个几台设备的算法就容易了,因为导弹要全部拦截,那么肯定是 每次都从最开始的拦截,有了固定的高度之后,只需要 每次都把能拦截的导弹从数组中去掉,在统计就可以得到结果。循环结束的条件是没有导弹。

代码如下:
#include<iostream>
#include<vector>
using namespace std;
vector<int>A;
int MAX = 0;
void Judge(int n, int max)
{
	if (max > MAX)
		MAX = max;

	for (int i = n; i < A.size(); i++)
	{
		if (A[i] < A[n - 1])
			Judge(i + 1, max + 1);
	}
}
int main()
{
	int n;
	while (cin >> n)
		A.push_back(n);

	for (int i = 0; i < A.size()-1; i++)
		Judge(i + 1, 1);

	int sum = 0;
	while (A.size())
	{
		int t = A[0];
		A.erase(A.begin());
		for (int j = 0; j < A.size(); j++)
		{
			if (A[j] < t)
			{
				t = A[j];
				A.erase(A.begin()+j);
				j--;
			}
		}
		sum++;
	}
	cout << MAX << endl << sum;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/tobealistenner/article/details/80079128