攔截導彈問題(
NOIP1999
)
某國為了防御敵國的導彈襲擊,開發出一種導彈攔截系統,但是這種攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以后每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的導彈來襲,由於該系統還在試用階段。所以一套系統有可能不能攔截所有的導彈。
輸入導彈依次飛來的高度(雷達給出的高度不大於30000的正整數)。計算要攔截所有導彈最小需要配備多少套這種導彈攔截系統。
【
輸入格式
】
n顆依次飛來的高度(1≤n≤1000).
【
輸出格式
】
要攔截所有導彈最小配備的系統數k。
【
輸入樣例
】
missile.in
389 207 155 300 299 170 158 65
【
輸出樣例
】
missile.out
2
【
輸入輸出樣例
】
輸入:導彈高度: 7 9 6 8 5
輸出:導彈攔截系統K=2
輸入:導彈高度: 4 3 2
輸出:導彈攔截系統K=1
【思路】怎樣貪心呢?對於系統來說系統盡量開得少,對於每個系統攔截導彈來說,盡量攔截較高的導彈,因為一旦攔截很低的導彈就沒法恢復高度了
所以開一個數組,記錄每個系統能攔截的最低的導彈;然后每來一個導彈就要從已經開的系統中找出一個能攔截導彈的高度比他大的且差值最小的,因為你
不能讓當前能攔截較高導彈的系統攔截這個導彈(我的語言表達能力也是醉了),你只需一個將將兒能攔住他的就行;如果能找到,修改這個系統能攔截的
最低高度,如果不能再開一個系統,將當前系統能攔截的導彈高度賦值給這個導彈的高度
爸爸不說了 直接上代碼
【代碼】
1 //攔截導彈問題 2 #include<iostream> 3 #include<cstdio> 4 #include<cstdlib> 5 using namespace std; 6 const int MAXX=1009; 7 int Ssystem[MAXX],Height[MAXX];//每個系統當前攔截的最低高度,和每個導彈的高度 8 int n,num=1; 9 int main() 10 { 11 scanf("%d",&n); 12 for(int i=1;i<=n;i++) 13 scanf("%d",&Height[i]); 14 Ssystem[num]=Height[1]; 15 for(int i=2;i<=n;i++) 16 { 17 int Short=0; 18 for(int j=1;j<=num;j++) 19 { 20 if(Ssystem[j]>=Height[i])//找出一個能攔住當前導彈的系統 21 if(Short==0)Short=j; 22 else 23 if(Ssystem[Short]>Ssystem[j])//從能攔截的系統中找出一個能將將兒攔住的來(orz) 24 Short=j;//記錄當前攔截導彈 25 } 26 if(Short==0)//找不到能攔截的系統 27 { 28 num++;//新開一個系統 29 Ssystem[num]=Height[i];//把新開的系統的高度修改為當前攔截的導彈的高度 30 } 31 else 32 Ssystem[Short]=Height[i];//能找到攔截的系統,修改它能攔截的高度 33 } 34 printf("%d\n",num); 35 return 0; 36 }