最少攔截系統

2021-10-08 06:28:46 字數 1154 閱讀 5944

分析(霧):很明顯這題是要求乙個最長上公升子串行。

求最長子序列的過程:

記原陣列為arr,用乙個新的陣列ans來儲存最長上公升子串行,初始化即有arr[1]=ans[1],用len記錄ans元素個數,然後開始比較後面的元素,顯然當arr[i]>ans[len]時,使ans[++len]=arr[i],以上都不是重點,重點是處理arr[i]<ans[len]時,由題意知飛彈攔截高度在逐漸遞減,也就是說要在ans[len]裡可以選取一高度(ans裡儲存的高度是某乙個飛彈攔截住可以攔截的最大高度)變成arr[i],是系統的攔截高度較少,那麼我們怎麼選擇飛彈攔截系統使得攔截所有飛彈所需要的攔截系統最少呢?根據貪心思想,我們應該是浪費的高度最少,比如說飛彈高度為5,7,2,6時,我們需要兩個攔截系統,我們首先確定至少需要兩個攔截系統,高度分別為5和7,然後應該用5去攔截2,而不是7攔截2,然後用7攔截6,所過上述用7攔截2,則5不能攔截6,需要三個攔截系統,不符合題目最少的要求。所以我們需要在ans陣列中進行查詢,找到第乙個大於等於當前應對飛彈的高度,暴力查詢用時是o(n)級別,因為ans是遞增的,所以我們可以採用二分查詢的方式,用時是o(logn)級別。

ac**

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn =

100010

;int arr[maxn]

;int up[maxn]

;int vis[maxn]

;bool

cmp(

int a,

int b)

intmain()

int sum =

0, len =

1, ans =0;

up[1]

= arr[1]

;for

(int i =

2; i <= n; i++

)else

} up[l]

=min

(up[l]

, x);}

}printf

("%d\n"

, len);}

}

最少攔截系統

description 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統.但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能超過前一發的高度.某天,雷達捕捉到敵國的飛彈來襲.由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈.怎麼辦呢...

最少攔截系統

題目 description 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統.但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能超過前一發的高度.某天,雷達捕捉到敵國的飛彈來襲.由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈.怎...

最少攔截系統

b 最少攔截系統 time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status description 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統.但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能...