HDU 1257 最少攔截系統

2021-09-19 17:19:34 字數 1194 閱讀 2455

傳送門

貪心?+二分。(還可以用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 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統.但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能超過前一發的高度.某天,雷達捕捉到敵國的飛彈來襲.由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有...