1. 程式人生 > >導彈攔截(貪心)

導彈攔截(貪心)

B - B

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Submit Status Practice HDU 1257

Description

某國為了防禦敵國的導彈襲擊,發展出一種導彈攔截系統.但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能超過前一發的高度.某天,雷達捕捉到敵國的導彈來襲.由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的導彈. 
怎麼辦呢?多搞幾套系統唄!你說說倒蠻容易,成本呢?成本是個大問題啊.所以俺就到這裡來求救了,請幫助計算一下最少需要多少套攔截系統. 

 

Input

輸入若干組資料.每組資料包括:導彈總個數(正整數),導彈依此飛來的高度(雷達給出的高度資料是不大於30000的正整數,用空格分隔) 

 

Output

對應每組資料輸出攔截所有導彈最少要配備多少套這種導彈攔截系統. 

 

Sample Input

8 389 207 155 300 299 170 158 65

 

Sample Output

 

2

其實這道題有很多種解法,可以用dp,但是比較起來還是貪心容易寫一些。

應為給出的導彈是按順序的,每個導彈都要被攔住,這裡要求最小的攔截系統的個數,所以我們每次攔截導彈時要遍歷所有的攔截系統找出導彈和攔截系統高度差最小的那個系統,不能攔截了就把當前的系統放在數組裡面,重新開一個攔截系統。

#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <stdio.h>
#define  LL long long
#define  ULL unsigned long long
#define mod 1000000007
#define INF 0x7ffffff
using namespace std;
const int MAXN = 2000005;
const int N = 15;
int dp[MAXN];
int main()
{
  int n;
  while(scanf("%d",&n)!=EOF){
        int sum=0;
    while(n--){
        int x;
        scanf("%d",&x);
        int Min=INF,flag=0,cot;
        int i;
        for(i=0;i<sum;i++){
            if(x<=dp[i]&&Min>dp[i]-x){
                Min=dp[i]-x;
                flag=1;
                cot=i;
            }
        }
        if(flag==0){
            dp[sum]=x;
            sum++;
        }
        else dp[cot]=x;
    }
    printf("%d\n",sum);
  }

    return 0;
}