HDOJ-1257 最少拦截系统
最少攔截系統
Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 39448????Accepted Submission(s): 15465
Problem Description
某國為了防御敵國的導彈襲擊,發展出一種導彈攔截系統.但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以后每一發炮彈都不能超過前一發的高度.某天,雷達捕捉到敵國的導彈來襲.由于該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的導彈.
怎么辦呢?多搞幾套系統唄!你說說倒蠻容易,成本呢?成本是個大問題啊.所以俺就到這里來求救了,請幫助計算一下最少需要多少套攔截系統.
?
Input
輸入若干組數據.每組數據包括:導彈總個數(正整數),導彈依此飛來的高度(雷達給出的高度數據是不大于30000的正整數,用空格分隔)
?
Output
對應每組數據輸出攔截所有導彈最少要配備多少套這種導彈攔截系統.
?
Sample Input
8 389 207 155 300 299 170 158 65
?
Sample Output
2
?
Source
浙江工業大學第四屆大學生程序設計競賽?
?
題意就是? 給出一行數據表示導彈的彈射高度? 已知系統是只能攔截比上一次射的導彈低一點的導彈 求該數串所用的最少攔截系統是多少
這道題其實就是求最長遞增子序列 為什么這么說呢
假設我們從第一個數開始向后遍歷,有所攔截的都是遞減序列 一旦我們遇到一個導彈高度 比上一個導彈高度高的 就說明該增加攔截系統了
然后再來一個遞減序列 又遇到了一個數比上一個數大時 此時需要考慮 如果這個數 比前面更新導彈系統更大時 說明前一個導彈系統hold不住了
需要再加一個導彈系統 如果這時的數小于更換導彈系統前的數 那么不必要更新 所以這道題目所有更新導彈系統的時候 還是在遞增序列的時候
所以求的是最長遞增子序列長度
求的方法就是 盡可能構造最大元素盡可能小的遞增序列
n*logn復雜度
當然還可以用dp做? n*n復雜度
#include<bits/stdc++.h> using namespace std; int a[1010],d[1010]; int main() {ios::sync_with_stdio(0);int n;while(cin>>n){for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<=n;i++){d[i]=1;for(int j=1;j<i;j++)if(a[i]>a[j]&&d[j]+1>d[i])d[i]=d[j]+1;}int m=0;for(int i=1;i<=n;i++)m = max(m,d[i]);cout<<m<<endl; }return 0; }總結
以上是生活随笔為你收集整理的HDOJ-1257 最少拦截系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [渝粤教育] 重庆大学 房屋建筑学 参考
- 下一篇: 《嵌入式系统开发之道——菜鸟成长日志与项