HDU 1257 最少拦截系统

Description

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹.
怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统.

Input

输入若干组数据.每组数据包括:导弹总个数(正整数),导弹依此飞来的高度(雷达给出的高度数据是不大于30000的正整数,用空格分隔)

Output

对应每组数据输出拦截所有导弹最少要配备多少套这种导弹拦截系统.

Sample Input

8 389 207 155 300 299 170 158 65

Sample Output

2

解题

有一点小坑的,不要看样例就觉得很简单。下面这组数据:
8 7,6,5,6,3,2,4,1
答案是3吗?是的话就听取WA声一片吧!其实对于这组数据,只要两套就够了
第一套拦截系统:7,6,5
第二套拦截系统:6,3,2

这题本质是 最小上升子序列,但是我做的时候才不管它是啥,直接做就完事了~
思路是,先对所有反导系统循环一遍,判断这颗弹是不是比所有反导系统都高,是的话反导系统总数就要增加1套,并且新的这套系统的高度呢,就是这枚导弹的高度。否则的话去寻找能打得到这枚导弹且高度最接近(这样才不会浪费,贪心的思想)的反导系统,使其高度变为这枚导弹的高度。
下面是代码:

代码

#include
#include

using namespace std;

int dp[10000]={0};
int main(){
	
	int n;
	while(cin>>n){
		memset(dp,0,sizeof(dp));
		dp[0]=30001;
		int x,count=1;
		while(n--){
			cin>>x;
			int toohigh=1;
			//每套系统循环一遍 ,判断这颗弹是不是比所有反导系统都高 
			for(int i=0;i<count;i++){
				if(x<=dp[i]){
					toohigh=0;
					break;
				}
			}
			if(toohigh){ //这颗弹比所有反导系统都高
				dp[count]=x;  
				count++;  //增加一套系统 
			}else{
				int min=30000,index=-1;
				//找距最小的反导系统 
				for(int i=0;i<count;i++){
					//如果这颗导弹比某反导系统低,记录差距 
					if(x<=dp[i]){
						if(dp[i]-x<min){  //差距最低 
							min=dp[i]-x;
							index=i;
						} 
					}
				}
				dp[index]=x;  //让差距最小的反导系统去拦截,故其高度减小
				 
			}
		}
		cout<<count<<endl;
		
	}
	return 0;
}

你可能感兴趣的:(c++,oj题)