【HDU-1257】最少拦截系统


点击打开链接


最少拦截系统

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 44681    Accepted Submission(s): 17510


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

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

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

Sample Input
8 389 207 155 300 299 170 158 65
 

Sample Output
2

//                   可以有两种方法: 1 )  用贪心算法 ;    2  )  LIS ;

//贪心代码如下:

/*
    如果输入为 5 100 97 98 96 97 
*/


#include <stdio.h>
const int maxn = 300010;
int n;
int a[maxn];
int fun(int n)
{
	for (int i = 0 ; i < n ; i++)
	  if (a[i] != -1)
	    return 1;
return 0;
}
int main()
{
	while(~scanf ("%d",&n))
	  {
	  	for (int i = 0 ; i < n ; i++) 
	  	  scanf ("%d",&a[i]);
	  	int ans = 0;
	  	int k;
	  	int temp;
	  	int fun(int n);
	  	while (fun(n))
	  	  {
	  	  	ans++;
	  	  	temp = 0;
	  	  	for (int i = 0 ; i < n ; i++) 
	  	  	  {
	  	  	  	  if (a[i] != -1)
	  	  	  	    {
	  	  	  	    	temp = a[i];
	  	  	  	    	a[i] = -1;
	  	  	  	    	k = i;
	  	  	  	    	break;
					}
			  }
			for (int i = k + 1 ; i < n ; i++) 
			  {
			  	if (a[i] != -1 && a[i] <= temp)
			  	  {
			  	  	temp = a[i];
			  	  	a[i] = -1;
				  }
			  }
		  
		  }
	  printf ("%d\n",ans);
	  }	
return 0;
}


//LIS代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 30010;
int dp[maxn], a[maxn];
int main()
{
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		for(int i=0;i<n;++i)  
            scanf("%d",&a[i]);  
        int ans=0;  
        for(int i=0;i<n;++i)  
        {  
            dp[i]=1;  
            for(int j=0;j<i;++j)  
            {  
                if(a[j]<a[i])  
                    dp[i] = max(dp[i], dp[j]+1);  
            }   
            ans=max(dp[i],ans);  
        }  
        printf("%d\n",ans);  
	}
	return 0;
} 

//另一种LIS代码如下:

#include <cstdio>  
#include <algorithm>  
#define INF 0x3f3f3f  
using namespace std;  
int dp[40010],a[40010];  
int main()  
{  
    int i,j;  
    int t,n;
    while(~scanf ("%d",&n))
	 {
        for(i=0;i<n;++i)  
        {  
            scanf("%d",&a[i]);  
            dp[i]=INF;  
        }  
        for(i=0;i<n;++i)  
            *lower_bound(dp,dp+n,a[i])=a[i];  
        printf("%d\n",lower_bound(dp,dp+n,INF)-dp);   
    }  
    return 0;  
}  





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章