NOIP2013花匠超多方法的題解

2021-08-08 18:32:42 字數 1995 閱讀 2291

原題見洛谷(

首先介紹一種我在做題的時候學到的一種空間複雜度為o(1)的解法

首先使用f1,f2分別記錄兩種不同的序列。就是一種為兩邊高中間低和一種為中間高兩邊低的序列。f1,f2的初始值都設成1(我們可以易證選擇了1第一盆其結果一定不會變差#手動滑稽)用x來記錄上一盆,h來記錄當前盆滿足一下幾個條件:

1.h==x時無需轉移

2.h>x時可以轉移其中乙個

3.h

#include

#include

#include

#include

using

namespace

std;

inline

int read()

return num;

}inline

void out(int x)

putchar(x%10+'0');

}int main()

if(h1);}}

out(max(f1,f2));

//printf("%d",max(f1,f2));

return

0;}

然後介紹一種看題解看到的用dp做的題解:

首先分析這道題可以大致的總結為:求乙個最長序列使得該序列的任意相鄰的三個元素中間的那個元素不是最大的就是最小的,這樣子我們連想到最長不下降子串行:比如元素d[i]和d[j],假設d[i]>d[j]且j>i,那麼我們會讓long_[j]=max(long_[j],long_[i]+1); 那麼我們可以模擬一下,最長不下降子串行是在當前節點前面找乙個符合條件的,那麼我們這道題也可以作為一道最長不下降子串行來做,只是當前節點尋找前驅的範圍是前乙個節點,而且我們還要用同樣的方法求乙個最長不上公升子串行,最後取max,那麼這道題就完了;

貼一篇偷悄悄搶來的**:

#include

#include

#define ii int

#define r register

#define i 123456

using

namespace

std;

ii a[i],d_1[i],d_2[i];

ii n;

int main()

}r ii ans=max(d_1[n],d_2[n]);

//我們在最後時取兩種狀態的最大值作為答案;

cout

0;}

本人親測這段**要16ms

再介紹一種是用貪心寫的**orz,簡單介紹一下思路吧:

先說說這個貪心的證明:

1.任意單調遞增或遞減的區間內不會有多於兩株留下。若有三株留下則矛盾。(這個自己畫個圖就好了吧)

2.任意n個相連續的單調遞增或遞減的區間內不會有多於n+1株留下。

3.只有取每個最大單調區間兩頭的植株,才不會影響對下乙個植株的選擇(才可以取到最多)。

再粘一下貪心的**:

#include

#include

#include

#include

#include

using

namespace

std;

int a[100010];

void jyxin(int &x)

int main()

if(n==1)cout

<<1;

jyxin(a[2]);

while(iif(a[i]==a[i-1])a[i-1]=a[i-2];

if((a[i]>a[i-1]&&a[i-2]>a[i-1])||(a[i]1]&&a[i-2]1]))sum++;

}if(sum==0)

else

cout

<2;

return

0;

}

大概這些就是這道題所有的解法了吧orz

模擬 NOIP 2013 花匠

花匠棟棟種了一排花,每株花都有自己的高度。花兒越長越大,也越來越擠。棟棟決定把這排中的一部分花移走,將剩下的留在原地,使得剩下的花能有空間長大,同時,棟棟希望剩下的花排列得比較別緻。具體而言,棟棟的花的高度可以看成一列整數h 1,h 2,h n。設當一部分花被移走後,剩下的花的高度依次為g 1,g ...

NOIP2013提高組 花匠

花匠棟棟種了一排花,每株花都有自己的高度。花兒越長越大,也越來越擠。棟棟決定把這排中的一部分花移走,將剩下的留在原地,使得剩下的花能有空間長大,同時,棟棟希望剩下的花排列得比較別緻。具體而言,棟棟的花的高度可以看成一列整數h 1,h 2,h n。設當一部分花被移走後,剩下的花的高度依次為g 1,g ...

NOIP2013提高組 花匠

題目描述 花匠棟棟種了一排花,每株花都有自己的高度。花兒越長越大,也越來越擠。棟棟決定把這排中的一部分花移走,將剩下的留在原地,使得剩下的花能有空間長大,同時,棟棟希望剩下的花排列得比較別緻。具體而言,棟棟的花的高度可以看成一列整數h 1,h 2,h n。設當一部分花被移走後,剩下的花的高度依次為g...