P1020 飛彈攔截

2022-03-18 16:47:04 字數 1346 閱讀 2743

<--------------個人**傳送門------------>

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

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

輸入格式:

1行,若干個整數(個數≤100000)

輸出格式:

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

輸入樣例#1:

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

6

2

為了讓大家更好地測試n方演算法,本題開啟spj,n方100分,nlogn200分

每點兩問,按問給分

做第二問之前需要知道的乙個定理,

dilworth定理:對於乙個偏序集,最少鏈劃分等於最長反鏈長度。

關於dilworth定理的證明:戳這裡!

在本題中的應用:乙個序列中最短下降子串行的個數就等於其最長不下降子串行的長度

解法一(比較常規的求最長上公升/下降子串行,o(n^2)):

dp解法,狀態轉移方程為    f[i]=max(f[i],f[j]+1)   ,j=i-1到1

100分**:

#includeusing namespace std;

int a[100005];

int f[100005];

int main()

int ans1=0;

for(int i=1;i<=m;i++)

ans1=max(ans1,f[i]);

}int ans2=0;

for(int i=1;i<=m;i++)

for(int i=1; i<=m; i++) else

}if(l!=0)f[l]=a[i];}}

cout<=a[i])r=mid;

else

}f[l]=a[i];}}

cout

}

P1020 飛彈攔截

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

P1020 飛彈攔截

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

P1020 飛彈攔截

原題鏈結 貪心 記錄每套系統攔截過的最小高度 新來的飛彈 如果高於所有飛彈的最低高度 那就只能再加一套了嘛 如果低於某些系統的最低高度 那就貪心 把它加到 最低高度最低的一套系統內 include include include include include include include inc...