題意簡述:求最長不上公升子串行的長度,並求出最少有幾個不上公升子串行。
解題思路:第一問直接用dp做,有o(n^2)的也有優化後o(nlgn)的,我才用的是前者。第二問可以用乙個陣列h來記錄當前所有系統的攔截高度,每次遇到乙個新元素,在h陣列中找乙個大於 a[i] 的最小的元素,並將其更新為 h[ j ] = a[i],如果沒有則將a[i]作為新元素新增進h陣列。
**示例:
#include#includeusing namespace std;
const int maxn = 1e5+10;
int a[maxn];
int f[maxn];
int h[maxn];
void solve(int n)
} int len = 0;
for(int i = 1;i <= n;i++) len = max(len,f[i]);
int cnt = 0;
for(int j = 1;j <= n;j++)
} if(x == -1) x = cnt++;
h[x] = a[j];
} printf("%d\n%d\n",len,cnt);
}int main()
solve(cnt);
return 0;
}
P1020 NOIP1999 普及組 飛彈攔截
第一問,單個系統最多能攔截多少飛彈,求最長不公升序列即可.拿出lis的模板塗塗改改.bool cmp const int a,const int b for int i 1 i n i if s i dp len len dp len s i else printf d n len 第二問,最少需要...
洛谷1020攔截飛彈(NOIP1999)
洛谷1020攔截飛彈 noip1999 題目描述 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不...
洛谷1020 NOIP1999 飛彈攔截 dp
我這裡講的是nlogn的做法。首先看第一問,第一問就是要求乙個最長不下降子串行,這個o n 2 的做法是很容易的。我這裡介紹的nlogn的方法是用線段樹的。我們發現高度是不超過50000的,所以我們可以把線段樹的每乙個下標i的含義變為目前加進來的高度為i的最長不下降子串行的長度是多少。然後我們需要做...