1. 程式人生 > 實用技巧 >導彈攔截

導彈攔截

題目描述

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

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

輸入格式

1行,若干個整數(個數\le 100000100000)

輸出格式

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

輸入輸出樣例

輸入

389 207 155 300 299 170 158 65

輸出

6
2

分析

貪心,取最大值(程式碼太久遠了自己寫的啥自己也看不懂)

程式

#include <bits/stdc++.h>

using namespace std;

int n = 0 , a[100001] , f[100001] , d[100001] , ans = 1 , t = 0;

int main() 
{
    while(~scanf("%d" , &a[++n]));
        n--;
    for(int i = 1; i <= n; i++) 
    {
        f[i] 
= 1; for(int j = t; j > 0; j--) if(a[i] <= a[d[j]]) { f[i] = f[d[j]] + 1; break; } t = max(t , f[i]); d[f[i]] = i; ans = max(ans , f[i]); } cout << ans << endl; ans = 1; t
= 0; for(int i = 1; i <= n; i++) { f[i] = 1; for(int j = t; j > 0; j--) if(a[i] > a[d[j]]) { f[i] = f[d[j]] + 1; break; } t = max(t , f[i]); d[f[i]] = i; ans = max(ans , f[i]); } cout << ans; return 0; }