程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 題目1085: 攔截導彈

題目1085: 攔截導彈

編輯:C++入門知識

題目描述 某國為了防御敵國的導彈襲擊,開發出一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的導彈來襲,並觀測到導彈依次飛來的高度,請計算這套系統最多能攔截多少導彈。攔截來襲導彈時,必須按來襲導彈襲擊的時間順序,不允許先攔截後面的導彈,再攔截前面的導彈。       輸入 每組輸入有兩行,第一行,輸入雷達捕捉到的敵國導彈的數量k(k<=25),第二行,輸入k個正整數,表示k枚導彈的高度,按來襲導彈的襲擊時間順序給出,以空格分隔。               輸出 每組輸出只有一行,包含一個整數,表示最多能攔截多少枚導彈。               樣例輸入 4 9 6 7 8 7 4 5 6 7 13 42 3 5 6 5 4 3 5 0     樣例輸出 2 2 4     提示 [+] *** 提示已隱藏,點擊上方 [+] 可顯示 ***       來源 2007年北京大學計算機研究生機試真題         【思路】     \         具體參考:算法之最長遞增子序列,最長公共子序列       [cpp] /*********************************  *   日期:2013-3-25  *   作者:SJF0115  *   題號: 題目1085: 攔截導彈  *   來源:http://acmclub.com/problem.php?id=1085  *   結果:AC  *   來源:2007年北京大學計算機研究生機試真題  *   總結:  **********************************/   #include<stdio.h>    #include<string.h>       int Height[26];   int MaxLen[26];      void LIS(int k){       memset(MaxLen,0,sizeof(MaxLen));       for(int i = 1;i <= k; i++){           MaxLen[i] = 1;           //遍歷其前所有導彈高度            for(int j = 1;j < i;j++){               //如果當前導彈高度小於等於j號導彈                if(Height[i] <= Height[j]){                   //把當前導彈放在j號導彈後,其最長不增子序列長度為j號導彈結尾的最長不增子序列長度 + 1                    int preMax = MaxLen[j] + 1;                   if(preMax > MaxLen[i]){                       MaxLen[i] = preMax;                   }               }           }       }   }       int main()   {       int N,i;       //freopen("C:\\Users\\SJF\\Desktop\\acm.txt","r",stdin);        while(scanf("%d",&N)!=EOF){           //輸入導彈高度            for(i = 1;i <= N;i++){               scanf("%d",&Height[i]);           }           LIS(N);           int Max = -1;           //輸出最長不增子序列的長度即能攔截的導彈數            for(i = 1;i <= N;i++){               if(Max < MaxLen[i]){                   Max = MaxLen[i];               }           }           if(N != 0){               printf("%d\n",Max);           }       }       return 0;   }     /********************************* *   日期:2013-3-25 *   作者:SJF0115 *   題號: 題目1085: 攔截導彈 *   來源:http://acmclub.com/problem.php?id=1085 *   結果:AC *   來源:2007年北京大學計算機研究生機試真題 *   總結: **********************************/ #include<stdio.h> #include<string.h>   int Height[26]; int MaxLen[26];   void LIS(int k){ memset(MaxLen,0,sizeof(MaxLen)); for(int i = 1;i <= k; i++){ MaxLen[i] = 1; //遍歷其前所有導彈高度 for(int j = 1;j < i;j++){ //如果當前導彈高度小於等於j號導彈 if(Height[i] <= Height[j]){ //把當前導彈放在j號導彈後,其最長不增子序列長度為j號導彈結尾的最長不增子序列長度 + 1 int preMax = MaxLen[j] + 1; if(preMax > MaxLen[i]){ MaxLen[i] = preMax; } } } } }   int main() { int N,i; //freopen("C:\\Users\\SJF\\Desktop\\acm.txt","r",stdin); while(scanf("%d",&N)!=EOF){ //輸入導彈高度 for(i = 1;i <= N;i++){ scanf("%d",&Height[i]); } LIS(N); int Max = -1; //輸出最長不增子序列的長度即能攔截的導彈數 for(i = 1;i <= N;i++){ if(Max < MaxLen[i]){ Max = MaxLen[i]; } } if(N != 0){ printf("%d\n",Max); } } return 0; }  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved