洛谷 P1020 飛彈攔截

2021-08-28 01:23:36 字數 1226 閱讀 2351

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

輸入飛彈依次飛來的高度(雷達給出的高度資料是\le 50000≤50000的正整數),計算這套系統最多能攔截多少飛彈,如果要攔截所有飛彈最少要配備多少套這種飛彈攔截系統。

輸入格式:

11行,若干個整數(個數\le 100000≤100000)

輸出格式:

22行,每行乙個整數,第乙個數字表示這套系統最多能攔截多少飛彈,第二個數字表示如果要攔截所有飛彈最少要配備多少套這種飛彈攔截系統。

輸入樣例#1:

389 207 155 300 299 170 158 65
輸出樣例#1:

6

2

解法:優化的最長上公升子串行問題

最近經常遇到這一類的dp。今天選拔賽也遇到一道用n^2演算法但始終超時。

一直沒有 學會這個nlogn演算法的姿勢。

現在學習一波。

#include #include #include #include #include #include #define pii pair#define vi vector#define ll long long

#define eps 1e-5

using namespace std;

const int maxn = 2e5 + 10;

int a[maxn];

int dp[maxn];

int asc[maxn];

mapvis;

int main()

len = lower_bound(dp, dp + n, 0,greater()) - dp;

cout << len << endl;

memset(asc, 1, sizeof(asc));

for(int i = 0; i < n; i++)

len = lower_bound(asc, asc + n, 0x1010101) - asc;

cout << len << endl;

return 0;

}

洛谷P1020 飛彈攔截

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

洛谷 P1020 飛彈攔截

題目大意 對於乙個飛彈攔截系統 它的第一發炮彈能夠攔截任意高度的飛彈,但之後攔截的每一發炮彈都不能高於前一發的高度。輸入n發飛彈依次飛來的高度a i 計算這套系統最多能攔截多少飛彈,如果要攔截所有飛彈最少要配備多少套這種飛彈攔截系統。1 n 100 0 a i 30000 題解 p i 表示攔截了第...

洛谷 P1020 飛彈攔截

思路 首先第一問 最多能攔下多少飛彈的答案是給出數列的最長不遞增子串行的長度。這個不難想到 而第二問 至少幾套飛彈系統的答案是給出數列的最長遞增子串行的長度。c include include include include using namespace std const int maxn 1e...