NOIP2014 飛揚的小鳥 DP

2022-08-03 06:42:11 字數 2882 閱讀 7674

[noip2014]飛揚的小鳥

——!x^n+y^n=z^n

題目描述:

為了簡化問題,我們對遊戲規則進行了簡化和改編:

遊戲介面是乙個長為n ,高為 m 的二維平面,其中有k 個管道(忽略管道的寬度)。

小鳥始終在遊戲介面內移動。小鳥從遊戲介面最左邊任意整數高度位置出發,到達遊戲介面最右邊時,遊戲完成。

小鳥每個單位時間沿橫座標方向右移的距離為1 ,豎直移動的距離由玩家控制。如果點選螢幕,小鳥就會上公升一定高度x ,每個單位時間可以點選多次,效果疊加;

如果不點選螢幕,小鳥就會下降一定高度y 。小鳥位於橫座標方向不同位置時,上公升的高度x 和下降的高度y 可能互不相同。

小鳥高度等於0 或者小鳥碰到管道時,遊戲失敗。小鳥高度為 m 時,無法再上公升。

現在,請你判斷是否可以完成遊戲。如果可以 ,輸出最少點選螢幕數;否則,輸出小鳥最多可以通過多少個管道縫隙。

輸入輸出格式:

輸入格式:

輸入檔名為 bird.in 。

第1 行有3 個整數n ,m ,k ,分別表示遊戲介面的長度,高度和水管的數量,每兩個整數之間用乙個空格隔開;

接下來的n 行,每行2 個用乙個空格隔開的整數x 和y ,依次表示在橫座標位置0 ~n- 1上玩家點選螢幕後,小鳥在下一位置上公升的高度x ,以及在這個位置上玩家不點選螢幕時,小鳥在下一位置下降的高度y 。

接下來k 行,每行3 個整數p ,l ,h ,每兩個整數之間用乙個空格隔開。每行表示乙個管道,其中p 表示管道的橫座標,l 表示此管道縫隙的下邊沿高度為l ,h 表示管道縫隙上邊沿的高度(輸入資料保證p 各不相同,但不保證按照大小順序給出)。

輸出格式:

輸出檔名為bird.out 。

共兩行。

第一行,包含乙個整數,如果可以成功完成遊戲,則輸出1 ,否則輸出0

。第二行,包含乙個整數,如果第一行為1 ,則輸出成功完成遊戲需要最少點選螢幕數,否則,輸出小鳥最多可以通過多少個管道縫隙。

輸入輸出樣例:

輸入樣例1#

10 10 6

3 9 

9 9 

1 2 

1 3 

1 2 

1 1 

2 1 

2 1 

1 6 

2 2 

1 2 7

5 1 5

6 3 5

7 5 8

8 7 9

9 1 3

輸出樣例1#

輸入樣例2#

10 10 4

1 2 

3 1 

2 2 

1 8 

1 8 

3 2 

2 1 

2 1 

2 2 

1  2 

1 0 2

6 7 9

9 1 4

3 8 10 

輸出樣例2#

【資料範圍】

對於30% 的資料:5 ≤ n ≤ 10,5 ≤ m ≤ 10,k = 0 ,保證存在一組最優解使得同一單位時間最多點選螢幕3 次;

對於50% 的資料:5 ≤ n ≤ 2 0 ,5 ≤ m ≤ 10,保證存在一組最優解使得同一單位時間最多點選螢幕3 次;

對於70% 的資料:5 ≤ n ≤ 1000,5 ≤ m ≤ 1 0 0 ;

對於100%的資料:5 ≤ n ≤ 100 0 0 ,5 ≤ m ≤ 1 0 00,0 ≤ k < n ,0正文部分:

這道題困擾了我好久啊…果然還是我太弱了….

很容易想到這是一道dp,注意可以在單位時間連續點螢幕,也就是說往上是完全揹包,而往下是01揹包。

如果用dp[i][j]表示到達(i,j)的最優解,易得:

dp[i][j]=min(dp[i-1][j+y[i-1],dp[i-1][j-k*x[i-1]]+1)

然而如果這樣,01和完全揹包要分開寫,先寫完全揹包,因為01只能從i-1轉移,如果先01可能會影響到完全揹包。

還有另一點就是處理管道的問題,對於dp[i][j],j處於管道位置,本來這個狀態不存在,應直接記為inf,但是由於完全揹包的需要,應在處理完完全揹包在將其置為inf,這樣我們可以記錄每個i的位置的上端和下端,就可以完美解決這個問題。

廢話不多說,上**,好菜...大佬見諒

1 #include2 #include3 #include4

using

namespace

std;

5 inline int

read();

6int min(int x,int y)

7int max(int x,int y)

8namespace

lys28

for(j=1;j<=m;j++) if(j+y[i-1]<=m) dp[i][j]=min(dp[i][j],dp[i-1][j+y[i-1

]]);

29for(j=1;j<=d[i];j++) dp[i][j]=inf;

30for(j=u[i];j<=m;j++) dp[i][j]=inf;31}

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

39else

if(!flag) break;40

}41if(flag)

47else printf("

0\n%d\n

",cnt);

48return0;

49}50}

51int

main()

57 inline int

read()

64while(c>='

0'&&c<='

9') kk=kk*10+c-'

0',c=getchar();

65return kk*ff;

66 }

NOIP2014 飛揚的小鳥

題目 分析 乙個揹包問題。i,j 是跳上來的情況時 可以由 i,j k 得到,則問題得到解決。注意 f陣列要先進行上公升操作,再進行下降操作,否則 i,j k 有可能是下降得到的,從而得到錯解 吸取我的教訓吧,調了好長時間 include include using namespace std co...

NOIP2014飛揚的小鳥

天哪細節問題調了乙個鐘,手速不夠快思路不夠清晰寫了乙個鐘,感覺一道第三題就要花掉我2個鐘那我比賽的時候腫麼辦qaq 說下這道題,首先純暴力,70分到手,然後我們把01揹包的轉移變成有上界的完全揹包,還有一些特殊情況特殊轉移,還是比較好看的,去年比賽不知是電腦問題還是什麼一直沒輸出,蠢到家了然後這題爆...

NOIP2014 飛揚的小鳥

傳送門 為了簡化問題,我們對遊戲規則進行了簡化和改編 1.遊戲介面是乙個長為n,高 為m的二維平面,其中有k個管道 忽略管道的寬度 2.小鳥始終在遊戲介面內移動。小鳥從遊戲介面最左邊任意整數高度位置出發,到達遊戲介面最右邊時,遊戲完成。3.小鳥每個單位時間沿橫座標方向右移的距離為1,豎直移動的距離由...