兩道NOIP裡的DP題目

2022-04-06 01:07:55 字數 2483 閱讀 9783

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

輸入格式

輸入資料為兩行,

第一行為飛彈的數目n(n<=1000)

第二行飛彈依次飛來的高度,所有高度值均為不大於30000的正整數。

輸出格式

1.輸出只有一行是這套系統最多能攔截的飛彈數和 2.要攔截所有飛彈最少要配備這種飛彈攔截系統的套數。兩個資料之間用乙個空格隔開

樣例輸入      

8389 207 155 300 299 170 158 65

樣例輸出

6 2可以先將這個問題分作兩個小問題解決,第乙個小問明顯是要求出最長非嚴格下降子串行,因為它要保證每一發炮彈都不能高於前一發的高度

第二個小問則是要你求出最長嚴格上公升子串行,這個結論就不能明顯的出啦,因為一開始我也想不出來,也是看了題解才懂。

證明過程:

目標首先是要保證所有的目標都要摧毀,既然每個目標都要被摧毀,那麼如果這個被摧毀的目標的後面的目標比它搞的話,摧毀這個目標

的飛彈系統就不能摧毀它後面的目標了。從而,我們所需要的炮彈系統的高度必定是嚴格上公升的序列~又因為要摧毀所有的目標,所以為最長嚴格

上公升子串行~

ps:這道題的資料目測比較弱,第二問我用非嚴格上公升去做也能ac。。。。。

附上ac的c++**:

1 #include 2 #include 3

4using

namespace

std;

5const

int maxn = 1111;6

inta[maxn],inc[maxn],dece[maxn];

7const

int inf = 0x3f3f3f3f;8

intmain()

23//

cout<24 dec =max(dec,dece[i]);25}

26//

cout<27 a[0] = -inf;//

注意重新初始化

28for(int i = 1;i <= n;++i)

33//

cout<34 inc =max(inc,inc[i]);35}

36//

cout<37 printf("

%d %d\n

",dec,inc);38}

39return0;

40 }

view code

題目描述

n位同學站成一排,**老師要請其中的(n-k)位同學出列,使得剩下的k位同學排成合唱隊形。

合唱隊形是指這樣的一種隊形:設k位同學從左到右依次編號為1,2…,k,他們的身高分別為t1,t2,…,tk, 則他們的身高滿足t1<...ti>…>tk(1<=i<=k)。

你的任務是,已知所有n位同學的身高,計算最少需要幾位同學出列,可以使得剩下的同學排成合唱隊形。

輸入格式

輸入的第一行是乙個整數n(2<=n<=100),表示同學的總數。第一行有n個整數,用空格分隔,第i個整數ti(130<=ti<=230)是第i位同學的身高(厘公尺)。

輸出格式

輸出包括一行,這一行只包含乙個整數,就是最少需要幾位同學出列。

樣例輸入 

8186 186 150 200 160 130 197 220

樣例輸出

4思路:

設dec[i] 是以a[i] 為結尾的最長嚴格上公升序列,inc[i] 是以a[i]開始的最長嚴格下降序列,所以 最終答案是 n - max(dec[i] + inc[i] - 1);

dec[i] 和inc[i] 仿照上面那道題 即可,不過注意**細節有所不同

1 #include 2 #include 3

4using

namespace

std;

5const

int maxn = 111;6

inta[maxn],inc[maxn],dece[maxn];

7const

int inf = 0x3f3f3f3f;8

intmain()23}

24 a[n+1] = -inf;//

注意重新初始化

25for(int i = n;i >= 1;--i)30}

31int ans = 0;32

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

35 printf("

%d\n

",n - ans + 1

);36}37

return0;

38 }

view code

兩道簡單的題目

第一次發表文章,就發表兩到簡單點的題目好了 第一道題目是這樣的 現在有乙個整數的陣列,然後給定乙個目標數,我們要做的是找出陣列中唯一存在的兩個不同的數,其相加能夠得到這個目標數,然後返回這兩個數的下標比如 given nums 2,7,11,15 target 9,because nums 0 nu...

中興筆試的兩道題目

中興的筆試的兩道題目,乙個題目是按頻次排序,乙個題目是動態規劃求揹包問題。題目描述 題意為從乙個無序陣列中,將其中的整數按照出現的頻次多少來排列 並且出現幾次就排列幾個 按照出現頻次從高倒低排序,並且頻次相同的時候做乙個穩定排序,先出現的排在前面,比如輸入為 1,2,1,2,9,9,1,6,4,4,...

兩道有意思的題目

碰到兩道有意思的題目,記錄一下。題目一 問,對於任意乙個正整數,是否存在乙個它的倍數全是由1和0組成?例如 1 1 1 2 5 10 2的5倍是10,10由1和0組成 3 37 111 3 的 37 倍是111,111 全部由1組成 4 25 100 4 的 25 倍是100,100 由1和0組成 ...