[NOIP1999] 攔截導彈

NOIP1999 攔截導彈  html

題目描述 Description ide

    某國爲了防護敵國的導彈襲擊,發展出一種導彈攔截系統。可是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈可以到達任意的高度,可是之後每一發炮彈都不 能高於前一發的高度。某天,雷達捕捉到敵國的導彈來襲。因爲該系統還在試用階段,因此只有一套系統,所以有可能不能攔截全部的導彈。 優化

  

輸入描述 Input Description ui

輸入導彈依次飛來的高度(雷達給出的高度數據是不大於30000的正整數) spa

  

輸出描述 Output Description code

輸出這套系統最多能攔截多少導彈,若是要攔截全部導彈最少要配備多少套這種導彈攔截系統。 orm

樣例輸入 Sample Input xml

389 207 155 300 299 170 158 65  htm

樣例輸出 Sample Output blog

6

2

數據範圍及提示 Data Size & Hint

導彈的高度<=30000,導彈個數<=20

 

 

 

 

思路

這道題的突破口在於問題的轉化= =

先是第一問: 「最多能攔截的導彈數」。根據題目中導彈的毛病,能夠把問題轉化成經典的最長不上升子序列,動態規劃O(cnt2)完美解決;

再看第二問: 「最少須要的系統數」。順延上一問的思路,「不可能由以前已經肯定的系統攔截下來的導彈」應當添加到當前位置前的最長上升子序列中。一樣是經典問題,動態規劃O(cnt2)

最後稍微得瑟一下→_→在沒有優化的狀況下,這段代碼在發帖前包攬了wikioi上「最快」「最短」以及「內存最少」三項指標~(好吧是由於這題太水了)

 

 1 #include <cstdio>
 2  using  namespace std;
 3  int H[ 22], Suc[ 22]={ 1}, Cnt[ 22]={ 1}, mS= 0, mC= 0;
 4  int main()
 5 {
 6     freopen( " testin ", " r ",stdin);
 7     freopen( " testout ", " w ",stdout);
 8      int i,j,t,cnt= 0;
 9      while(scanf( " %d ", &t)== 1)
10         H[cnt++]=t;
11      for(i= 1;i<cnt;++i) {
12         Suc[i]=Cnt[i]= 1;
13          for(j=i- 1;j>= 0;--j) {
14              if(H[j]>=H[i]&&Suc[j]>=Suc[i])
15                 Suc[i]=Suc[j]+ 1;
16              if(H[j]<H[i]&&Cnt[j]>=Cnt[i])
17                 Cnt[i]=Cnt[j]+ 1;
18         }
19          if(Suc[i]>mS)mS=Suc[i];
20          if(Cnt[i]>mC)mC=Cnt[i];
21     }
22     printf( " %d\n%d ", mS, mC);
23      return  0;
24 }
相關文章
相關標籤/搜索