拦截导弹问题(贪心)

描述

某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统,但是这种拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,由于该系统还在试用阶段。所以一套系统有可能不能拦截所有的导弹。

输入导弹依次飞来的高度(雷达给出的高度不大于30000的正整数)。计算要拦截所有导弹最小需要配备多少套这种导弹拦截系统。

格式

输入格式

n颗依次飞来的高度(1≤n≤1000)。

输出格式

要拦截所有导弹最小配备的系统数k。

样例

输入样例

389 207 155 300 299 170 158 65

输出样例

2

限制

时间限制: 1000 ms

内存限制: 65536 KB

#include <iostream>
#include <string.h>
using namespace std;

int main()
{
    int n=0, tmp, x, k=1, tmp2, a[1005], b[1005];//a[]用来存储导弹高度,b[]用来存储系统高度
    bool flag = true;                            //flag用于判断是否需要增加一套系统
    memset(a, 0, sizeof(a));                     //初始化
    memset(b, 0, sizeof(b));
	while(cin >> tmp) {
    	a[++n] = tmp;               //下面的两句,我没有注释时,测试只过了30%,注释后可以AC
//    	if (getchar() == '\n')	
//			break;
	}
	b[1]=a[1];
	for (int i=2; i<=n; i++) {
		flag = true;
		tmp2 = 100005;                    //用于记录差值,然后作比较
		for (int j=1; j<=k; j++) {
			if (b[j] > a[i]) {		
				flag = false;
				int tmp3 = 0;    //用于记录差值,然后作比较
				for (int m=j; m<=k; m++) {	//若多套系统同时满足时,选取差值最小的系统,因为贪心 
					tmp3 = b[m] - a[i];
					if (tmp3 < tmp2) {	
						tmp2 = tmp3;
						x = m;	 //记录“所花费代价最小”的系统下标 
					}
				}
			}
		}
		if (flag) {
			k +=1;
			b[k] = a[i];	//添加新系统 
		} else {
			b[x] = a[i];	//更新老系统 
		}
	}
	printf ("%d\n", k);
	k = 0;
    return 0;
}


发布了89 篇原创文章 · 获赞 77 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/wodemaoheise/article/details/104695219