某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷:
雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷
達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有
的飛彈。
輸入資料:
第一行為乙個整數 n,表示飛來的飛彈個數,n<=100000
第二行為 n 個整數,依次表示飛彈飛來的高度,高度資料為不大於 30000 的正整數。
輸出資料:
第一行,輸出計算這套系統最多能攔截多少飛彈
第二行,輸出要攔截所有飛彈最少要配備多少套這種飛彈攔截系統。
樣例 輸入檔案:missile.in
8 389 207 155 300 299 170 158 65
輸出檔案:missile.out
6
2
這是一道線性動態規劃,但需要單調佇列和二分優化。
優化前的求最長不降子串行的方法:用f[i]表示以i結尾的最長不降子串行的長度,然後用這個方程f[i] = max(f[j]) + 1(j的高度必須大於等於i的高度)轉移。
優化方法:
求最長不降子串行時,維護乙個len[height]值,即f值為height的最大下標,則每次只需要找到乙個在len陣列中的高度恰好大於f[i]的值,這樣就可以使用二分優化了。
由於len陣列是單調的,每次用二分找到這個位置,最後形成的乙個最大長度的len陣列即為所求。
對於題目中的第二個問,只需要求一次最長上公升子串行即可。
accode:
#include #include #include #include using std::max;
using std::min;
const char fi = "missile.in";
const char fo = "missile.out";
const int maxn = 100010;
const int max = 0x3fffff00;
int len[maxn];
int h[maxn];
int n;
void init_file()
void readdata()
void work()
else r = mid - 1;
}now = c + 1;
len[now] = max(len[now], h[i]);
ans = max(ans, now);
}printf("%d\n", ans);
ans = 0;
len[0] = 0;
for (int i = 1; i < n + 1; ++i)
len[i] = max;
for (int i = 1; i < n + 1; ++i)
else r = mid - 1;
}now = c + 1;
len[now] = min(len[now], h[i]);
ans = max(ans, now);
}printf("%d", ans);
} int main()
飛彈攔截 動態規劃
描述 某國為了防禦敵國的飛彈襲擊,開發出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲,並觀測到飛彈依次飛來的高度,請計算這套系統最多能攔截多少飛彈。攔截來襲飛彈時,必須按來襲飛彈襲擊的...
動態規劃之飛彈攔截
題目描述 某國為了防禦敵國的飛彈襲擊,發展一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於等於前一發的高度。某天,雷達捕捉到敵國飛彈來襲。由於該系統還在試用階段,所以只用一套系統,因此有可能不能攔截所有的飛彈。輸入資料 第一行輸入測...
動態規劃 攔截飛彈
動態規劃 攔截飛彈 時間限制 1 sec 記憶體限制 256 mb 張琪曼 老師,修羅場是什麼?墨老師 修羅是佛家用語,修羅畢生以戰鬥為目標,修羅場指的是他們之間的死鬥坑,人們通常用 修羅場 來形容慘烈的戰場。後來又引申出 乙個人在困境中做絕死奮鬥 的意思。所以,這其實也在暗示我們,即使是身處絕境,...