【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;  
}  





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