[ luogu ] P1020 導彈攔截
阿新 • • 發佈:2017-07-25
它的 找到 std cout 所有 階段 blog logs ret
題目描述
某國為了防禦敵國的導彈襲擊,發展出一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的導彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的導彈。
輸入導彈依次飛來的高度(雷達給出的高度數據是不大於30000的正整數),計算這套系統最多能攔截多少導彈,如果要攔截所有導彈最少要配備多少套這種導彈攔截系統。
輸入輸出格式
輸入格式:
一行,若幹個正整數最多100個。
輸出格式:
2行,每行一個整數,第一個數字表示這套系統最多能攔截多少導彈,第二個數字表示如果要攔截所有導彈最少要配備多少套這種導彈攔截系統。
輸入輸出樣例
輸入樣例#1:389 207 155 300 299 170 158 65輸出樣例#1:
6 2
詳細內容
如下(代碼中有解析)
本弱的代碼
1 #include<bits/stdc++.h> 2 int max(int x,int y)//比較大小函數 3 { 4 if(x>y) 5 return x; 6 else 7 return y; 8 } 9 10 using namespace std; 11 int n,a[105],dp[105],maxn=-1; 12 int m[105];13 int main() 14 { 15 while ((scanf("%d",&a[++n]))!=EOF){}//無限輸入 16 n=n-1; 17 int min,k=1,mini;//k代表導彈攔截系統需要幾套 18 m[1]=a[1];//m數組用於存儲當前第k組中的最低導彈高度 19 for(int i=2;i<=n;i++) 20 {min=30000;//題目條件,導彈最高不超過30000 21 22 for(int j=1;j<=k;j++)//尋找當前k組中,是否有滿足該導彈加入的序列23 if(m[j]>=a[i]&&m[j]<min)//若第j組的最小值比當前讀入高度大 24 { 25 min=a[i];//與m[j]<min相應,保證該數只存在一個數組中 26 mini=j; 27 } 28 29 if(min==30000)//即上面沒有找到符合的遞減序列 30 { 31 k+=1;//創造一個新的遞減序列 32 m[k]=a[i]; 33 } 34 else//即上面有找到符合的遞減序列 35 m[mini]=a[i]; 36 } 37 cout<<k<<endl; 38 return 0; 39 }
[ luogu ] P1020 導彈攔截