某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。
但是這種飛彈攔截系統有乙個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。
某天,雷達捕捉到敵國的飛彈來襲。
由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。
輸入飛彈依次飛來的高度(雷達給出的高度資料是不大於30000的正整數,飛彈數不超過1000),計算這套系統最多能攔截多少飛彈,如果要攔截所有飛彈最少要配備多少套這種飛彈攔截系統。
輸入格式
共一行,輸入飛彈依次飛來的高度。
輸出格式
第一行包含乙個整數,表示最多能攔截的飛彈數。
第二行包含乙個整數,表示要攔截所有飛彈最少要配備的系統數。
輸入樣例:
389 207 155 300 299 170 158 65
輸出樣例:62
歷程:第二問還是老樣子,錯誤的思路,唉傷心,還得多積累啊
思路: 第一問的思路很簡單,就是求一下最長下降子串行問題,主要還是第二問吶,第二問其實用貪心來解決,當然結論也很簡單,就是最長上公升子串行,從前列舉每個數,對於每個數,採取兩種策略:
第一種:如果當前子串行的結尾都小於該數,那麼建立乙個新的子串行。
第二種:找到第個最小的大於等於該數的數,將該數改為這個數。
證明的話用調整法:
首先找到貪心法與最優解第一次操作不同的數,那麼我們根據上邊的描述, 一定可以將最優解的操作改變成我們的貪心法的操作,且不增加子串行的數量。
我們發現,這個操作與某個題的最長上公升子串行nlogn複雜度做法一樣,那麼我們就可以將這個問題看成求最長上公升子串行問題。
**:
#include
#include
#include
using
namespace std;
const
int n =
1010
;int a[n]
, idx =
1, f[n]
;int
main()
res =
max(f[i]
, res)
;//cout << f[i] << endl;
} cout << res << endl;
vector<
int> as;
for(
int i =
1; i < idx; i ++)}
cout << as.
size()
<< endl;
return0;
}
該問題還有乙個公升級版
為了對抗附近惡意國家的威脅,r國更新了他們的飛彈防禦系統。
一套防禦系統的飛彈攔截高度要麼一直 嚴格單調 上公升要麼一直 嚴格單調 下降。
例如,一套系統先後攔截了高度為3和高度為4的兩發飛彈,那麼接下來該系統就只能攔截高度大於4的飛彈。
給定即將襲來的一系列飛彈的高度,請你求出至少需要多少套防禦系統,就可以將它們全部擊落。
輸入格式
輸入包含多組測試用例。
對於每個測試用例,第一行包含整數n,表示來襲飛彈數量。
第二行包含n個不同的整數,表示每個飛彈的高度。
當輸入測試用例n=0時,表示輸入終止,且該用例無需處理。
輸出格式
對於每個測試用例,輸出乙個佔據一行的整數,表示所需的防禦系統數量。
資料範圍
1≤n≤50
輸入樣例:
53 5 2 4 1
0輸出樣例:
樣例解釋
對於給出樣例,最少需要兩套防禦系統。
一套擊落高度為3,4的飛彈,另一套擊落高度為5,2,1的飛彈。
這道題目的話沒有很好的方式去解決,直接暴搜。
考慮兩種暴搜方式, 兩種方式的用時差不多500+ms
第一種:迭代加深
#include
using
namespace std;
const
int n =55;
int a[n]
, up[n]
, down[n]
, n;
bool
dfs(
int de,
int count,
int ups,
int downs)
else
up[k]
= t;
k =0;
while
(k < downs && down[k]
< a[count]
) k ++
;
t = down[k]
; down[k]
= a[count];if
(k == downs)
else
down[k]
= t;
return
false;}
intmain()
return0;
}
第二種暴搜方式 :設定全域性變數
#include
#include
using
namespace std;
const
int n =55;
int a[n]
, up[n]
, down[n]
, n, ans =
0x3f3f3f3f
;void
dfs(
int count,
int upc,
int downc)
int k =0;
while
(k < upc && up[k]
>= a[count]
) k ++
;int t = up[k]
;
up[k]
= a[count];if
(k >= upc)
dfs(count +
1, upc +
1, downc)
;else
dfs(count +
1, upc, downc)
; up[k]
= t;
k =0;
while
(k < downc && down[k]
<= a[count]
)k ++
; t = down[k]
; down[k]
= a[count];if
(k == downc)
dfs(count +
1, upc, downc +1)
;else
dfs(count +
1, upc, downc)
;
down[k]
= t;
}int
main()
return0;
}
飛彈防禦系統 飛彈攔截系統
題目鏈結 引言 請忽略 今天是小白acm集訓的日子,然後資料結構實在是太難了,真是學不動了,然後就只能無助地去複習以前的題了,記得以前在sdut程設二裡面有一道題叫最少攔截系統,它是一道貪心,我個人覺得最長上公升子串行的思路跟它有些相似。我們先分析一下這道題,引入一下這道最少攔截系統的題幹和 最少攔...
飛彈防禦系統
飛彈防禦系統 為了對抗附近惡意國家的威脅,r國更新了他們的飛彈防禦系統。一套防禦系統的飛彈攔截高度要麼一直嚴格單調上公升要麼一直嚴格單調下降。資料範圍 1 n 50 輸入樣例 5 3 5 2 4 1 0輸出樣例 2樣例解釋 對於給出樣例,最少需要兩套防禦系統。一套擊落高度為3,4的飛彈,另一套擊落高...
1048 飛彈防禦系統
時間限制 1 sec 記憶體限制 128 mb 提交 305 解決 75 提交 狀態 討論版 某國為了防禦敵國的飛彈襲擊,開發出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲,並觀測到飛...