洛谷 P1020 飛彈攔截 N logN)

2022-05-10 06:04:12 字數 1086 閱讀 4639

首先此一眼就能看出來是乙個非常基礎的最長不下降子串行(lis),其樸素的 n^2做法很簡單,但如何將其優化成為n*logn?

我們不妨換乙個思路,維護乙個f陣列,f[x]表示長度為x的lis的最大的最後乙個數字是f[x]。(為什麼是最大的?可以應用貪心的思想,發現對於相同的x,f[x]越大其後可能擴充套件的情況就越多,即就越優)我們可以發現f陣列單調遞減(為什麼?也可使用反證法證明,在此不贅述)對於決策單調性問題,一般使用二分法優化,這就是logn的來歷。二分的邊界條件一定要寫對。

**如下:

#include #include #include #include #include using namespace std;

int read()

while(c>='0'&&c<='9')

return fh*rv;

}//快讀

int num[100005],f[100005],q[100005];

int find1(int x)else

} //if(l<=f[0]) return l;

if(r>=1) return r;

return 0;

}int find2(int x)else

} if(r>=1) return r;

return 0;

}int main(){

freopen("in.txt","r",stdin);

while(scanf("%d",&num[++num[0]])==1) ;

num[0]--;//一定要減

f[1]=num[1];f[0]++;

for(int i=2;i<=num[0];i++){

int pos=find1(num[i]);

if(pos){

if(f[0]==pos) f[0]++;

f[pos+1]=max(f[pos+1],num[i]);

//cout《對於第二問,可使用dilworth定理,翻譯成通俗易懂的語言就是:

對於乙個序列,其最少的不降子串行劃分=最長上公升子串行長度,所以對於第二問輸出最長上公升子串行長度即可。

洛谷P1020 飛彈攔截

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

洛谷 P1020 飛彈攔截

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

洛谷 P1020 飛彈攔截

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