傳送門
貪心?+二分。(還可以用dp。。)
首先要把問題想清楚,每個攔截系統負責攔截的飛彈子串行都必須是遞減的(不要求嚴格遞減)。給你乙個總體的飛彈到達序列,問你最少安排多少個攔截系統。
可以想到,每個攔截系統都有乙個當前可用的上限值,表示這個系統當前可攔截的最大值。
上述第二點就是貪心策略,可以想到這樣是最優策略,「最省」系統,物盡其用。
可以發現:隨著飛彈序列加入的攔截系統的上限序列正好是保持遞增的(其實還能保證嚴格遞增)。所以上述第二點可以用二分求解,在遞增的上限序列中找第乙個>=
當前飛彈的下標。
(二分問題都可以轉化為:在乙個序列a
中找 第乙個(或 最後乙個)a[i]
的對應值b[i]
滿足條件c
的下標,其序列b
必須滿足「前面都不滿足、後面都滿足(或 前面都滿足,後面都不滿足)」的性質),隨後我會寫乙個二分各種情況的總結。
這道題還看見一種寫法,居然可以直接求最長嚴格遞增子串行,666
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int n;
vector<
int> v;
// 儲存每個攔截系統的當前上限,可以看出v陣列是保持嚴格遞增的(保持遞增就可以用二分)
void
init()
intbinary_find
(int h)
// 遞增序列,找第乙個大於等於,意思就是盡可能用最接近的系統去攔截
return l;
}int
main()
if(h > v[v.
size()
-1])
// 比最大值還大,必須新建乙個攔截系統
v.push_back
(h);
else
}printf
("%d\n"
, v.
size()
);}}
hdu1257 最少攔截系統
解釋 當炮彈乙個接乙個的從空中飛來時,系統可以攔住比它攔住前乙個高度低的炮,比前乙個高的不攔,給第二個系統攔 problem description 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統.但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能超過...
hdu 1257 最少攔截系統
題目大意 給定一串飛彈的高度,問最少需要多少飛彈攔截系統。思路 lis 分析 首先,至少需要一套攔截系統,一開始可以打到第一顆飛彈的位置。之後每來一顆飛彈更新一下系統能打到的高度。一旦有一顆飛彈所有系統都打不到了,增加乙個系統。那麼就會得到乙個序列,每個系統目前能打到的最高位置。這個序列是遞增的,後...
HDU1257 最少攔截系統
problem description 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統.但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能超過前一發的高度.某天,雷達捕捉到敵國的飛彈來襲.由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有...