noip2014 飛揚的小鳥

2022-05-15 18:24:41 字數 3001 閱讀 9412

這題之前做過…先聽後做的 所以直接打了優化的dp、

然而不是自己想的方法還是理解的不好 一直75分 wa到挺

今天考試看到暴力dp70分 很自信加上點

continue break啥的就80+了

比優化的dp得分多 機智的我哈哈哈…..

然而手殘了..列舉k次蹦躂結果轉移的時候我特麼都是+1不是+k

悲傷的我眼淚掉下來…..

然後改過來就80了 又不好辦了..

下面是80分**

#include

#include

#include

#define maxn 10010

using

namespace

std;

int n,m,k,f[maxn][maxn/10],ans=0x7fffffff

,s;int xi[maxn],sh[maxn],x[maxn],y[maxn],falg[maxn];//

x 為上 y為下

intmain()

memset(f,

127/3,sizeof

(f));

for(int i=1;i<=m;i++)f[0][i]=0

;

for(int i=0;i)

for(int j=1;j<=m;j++)

ii=i+1;jj=j-y[i];

if(jj<=xi[ii]||jj>=sh[ii])continue

; f[ii][jj]=min(f[ii][jj],f[i][j]);

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

for(int j=1;j<=m;j++)

if(f[i][j]0][0]&&falg[i]==1

)

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

ans=min(ans,f[n][i]);

if(s==k)printf("

1\n%d\n

",ans);

else printf("

0\n%d\n

",s);

return0;

} 後來同桌終於在提交40+遍之後找到了錯誤

真是 隱蔽….

果然不是自己想的方法不好差錯誤啊…

這裡的優化是省掉了列舉蹦躂幾次 那蹦躂好幾次的怎麼辦呢

可以認為他是先蹦躂到i,j 的下面i,j-h的地方然後在一次到i j

圖自己腦補一下. 注意先處理上公升在處理下落 要不可能上公升時用到的狀態的剛才下落來的.

下面是wa到挺得75分

#include

#include

#include

#define inf 10000

#define maxn 10010

using

namespace

std;

int n,m,k,up[maxn],down[maxn],ans=inf,now;

int lu[maxn],ld[maxn],f[maxn][maxn/10

],far;

intmain()

intx,y,z;

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

memset(f,

127/3,sizeof

(f));

for(int i=0;i<=m;i++)f[0][i]=0

;

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

for(int j=1;j<=m;j++)

}for(int i=1;i<=m;i++)

ans=min(ans,f[n][i]);

if(far==k)printf("

1\n%d\n

",ans);

else printf("

0\n%d\n

",far);

return0;

}錯誤出在那兩個continue上…

可能出現那種省略掉k的轉移正好來自柱子上 但是他是我們腦補出來的 他是合法的狀態

所以不能continue掉 應該先更新完 再給柱子弄成inf

#include

#include

#include

#define maxn 10010

#define inf 707406378

using

namespace

std;

int n,m,k,up[maxn],down[maxn],ans=0x7fffffff

,now;

int lu[maxn],ld[maxn],f[maxn][maxn/10

],far,falg[maxn];

int min(int a,int

b)int

main()

ld[n]=0;lu[n]=m+1

;

intx,y,z;

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

memset(f,

127/3,sizeof

(f));

for(int i=0;i<=m;i++)f[0][i]=0

;

for(int i=0;i)

for(int j=1;j<=m;j++)

if(j<=ld[i+1]||j>=lu[i+1])f[i+1][j]=inf;

for(int j=1;j<=m;j++)

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

for(int j=1;j<=m;j++)

if(f[i][j]1

)

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

ans=min(ans,f[n][i]);

if(far==k)printf("

1\n%d\n

",ans);

else printf("

0\n%d\n

",far);

return0;

}

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,豎直移動的距離由...