洛谷P2831 憤怒的小鳥 貪心?狀壓DP

2022-05-12 11:48:09 字數 1388 閱讀 2927

題目:

一開始想 n^3 貪心來著;

先按 x 排個序,那麼第乙個不就一定要打了麼?

在列舉後面某乙個,和它形成一條拋物線,選能順便打掉最多的那個;

然後連樣例都過不了...

#include#include

#include

#include

#include

#define eps 1e-9

using

namespace

std;

intt,n,m,ans;

bool vis[20

];struct

np[20

];bool cmp(n x,n y)

intmain()

if(cnt>mx)mx=cnt,aa=a,bb=b;

}if(aa||bb)

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

if(fabs(aa*p[j].x*p[j].x+bb*p[j].x-p[j].y)1

; ans++;

}printf(

"%d\n

",ans);

}return0;

}

囧仔細想想,貪心可能是錯的;

正解是狀壓dp,dp真是與貪心相對的正確解法啊...

n 很小,所以想到狀壓,記錄所有可能的拋物線的打豬情況;

然後類似揹包轉移即可...

**如下:

#include#include

#include

#include

#include

#define eps 1e-8

using

namespace

std;

int t,n,m,f[262900],g[500

],tot;

double x[20],y[20

];bool ck(int k,double a,double

b)int

main()

for(int i=0;i1

<

sort(g+1,g+tot+1

); tot=unique(g+1,g+tot+1)-g-1

; memset(f,

0x3f,sizeof f); f[0]=0

;

for(int i=0;i

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

f[i|g[j]]=min(f[i|g[j]],f[i]+1

); printf(

"%d\n

",f[(1

<1

]); }

return0;

}

洛谷 P2831 憤怒的小鳥

kiana最近沉迷於一款神奇的遊戲無法自拔。簡單來說,這款遊戲是在乙個平面上進行的。有一架彈弓位於 0,0 處,每次kiana可以用它向第一象限發射乙隻紅色的小鳥,小鳥們的飛行軌跡均為形如 當小鳥落回地面 即x軸 時,它就會瞬間消失。在遊戲的某個關卡裡,平面的第一象限中有n只綠色的小豬,其中第i只小...

洛谷p2831憤怒的小鳥

原題 每個豬的位置不同,所以不能簡單的表示出狀態,all i 表示第i個拋物線打掉了哪些豬,其值本身儲存狀態 二進位制 只需要找所有有用的拋物線,然後狀壓f i 表示i狀態下最少用掉的鳥,轉移方程見 其中的m可以用來優化。雖然長,但是比較好懂。include include include incl...

洛谷 P2831 憤怒的小鳥

狀壓dp text dpn 18 n leq 18 n 18 不是暴搜就是狀壓,因為我jio jioji o得狀壓會比較好理解,所以就寫一篇狀壓的題解叭 首先我們要預處理出經過任意兩點的拋物線可以擊中的小豬有哪些,可以用lin e i j line i j line i j 來表示經過i,j i,j...