1. 程式人生 > >1322:【例6.4】攔截導彈問題(Noip1999)

1322:【例6.4】攔截導彈問題(Noip1999)

【題目描述】

某國為了防禦敵國的導彈襲擊,開發出一種導彈攔截系統,但是這種攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的導彈來襲,由於該系統還在試用階段。所以一套系統有可能不能攔截所有的導彈。

輸入導彈依次飛來的高度(雷達給出的高度不大於30000的正整數)。計算要攔截所有導彈最小需要配備多少套這種導彈攔截系統。

【輸入】

n顆依次飛來的高度(1≤n≤1000)。

【輸出】

要攔截所有導彈最小配備的系統數k。

【輸入樣例】

389 207 155 300 299 170 158 65

【輸出樣例】

2

【提示】

輸入:導彈高度: 4  3  2

輸出:導彈攔截系統k=1

#include<bits/stdc++.h>
using namespace std;
int s[1005];
int l[1005];
int main()
{
    int n;
    n=1;
    memset(s,0,sizeof(s));
    memset(l,0,sizeof(l));
    while(cin>>s[n])
    {
        n++;
    }
    int k=1;
    l[k]=s[1];
    int p=0;
    for(int i=2;i<n;i++)
    {
        p=0;//每次都要設定為0,
        for(int j=1;j<=k;j++)//一共有k套系統
        {
            if(l[j]>=s[i])//從k套系統選擇
            {
                if(p==0)
                    p=j;
                else if(l[j]<l[p]) p=j;//貪心,選擇最小系統中最小的值,然後後面會把這個比最小系統還小的值賦值給這個最小系統的最小值
            }
        }
        if(p==0)
        {
            k++;
            l[k]=s[i];
        }
        else
        {
            l[p]=s[i];
        }
    }
    cout<<k<<endl;
    return 0;
}

分析:

1.首先這題是貪心,是貪心從k套系統選擇最小的系統來判斷選擇哪個系統比如說這個的案例最小都是 155 和 65 當出現一個下降    數列最小是66 的時候我們應該選擇65這個系統

2.解題過程:

 a.把第一個l[1]設定為第一個系統,如果第二個導彈比第一個小哪l[1]=s[2]

 c.當有k個系統的時候就是每次來一個導彈就要比較最小的系統這個數與這個導彈的值,如果最小系統不小於這個導彈那麼就是把   這個導彈的值賦值給最小系統,這裡的p用法可以瞭解一下