P2831 憤怒的小鳥

2022-05-19 18:37:54 字數 1327 閱讀 2388

傳送門

看到資料範圍就知道是搜尋或狀壓dp

算了一波複雜度搜尋好像過不了極限資料

搞狀壓設 f [ i ] 表示所有豬的狀態為 i (二進位制下1表示死了,0表示沒死)時需要的最少發射次數

設 p [ i ] [ j ] 存經過第 i 只豬和第 j 只豬的拋物線經過的豬的狀態(可以$n^2$預處理出來,解方程都會吧..)

找到第乙個沒死的豬 i ,然後列舉所有其他沒死的豬 j ,進行轉移:

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

不用 n^2 列舉所有兩隻豬的 p [ i ] [ j ] ,因為第一頭豬現在不死以後也要死,所以沒有任何區別

當然還要考慮只經過一頭豬的情況: f [ i|(1<

注意拋物線解析式中 a<0,記得判一下合法性

#include#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;inline

intread()

while(ch>='

0'&&ch<='

9')

return x*f;

}const

double eps=1e-8

;const

int n=300007

;int

n,m,t;

struct

data

d[27

];double

a,b;

inline

void slove(double x1,double y1,double x2,double y2)//

解方程int p[27][27

];int

f[n];

void

pre()

}int

main()

//找到第一只沒死的豬

f[i|(1

<1

<1);//

單獨考慮

for(int j=pos+1;j//

與其他豬一起考慮

if( !((i>>j)&1) ) f[i|p[pos+1][j+1]]=min(f[i|p[pos+1][j+1]],f[i]+1);//

注意p的下標

} printf(

"%d\n

",f[mx]);

}return0;

}

P2831 憤怒的小鳥

kiana最近沉迷於一款神奇的遊戲無法自拔。簡單來說,這款遊戲是在乙個平面上進行的。有一架彈弓位於 0,0 處,每次kiana可以用它向第一象限發射乙隻紅色的小鳥,小鳥們的飛行軌跡均為形如y ax 2 bxy ax2 bx的曲線,其中a,b是kiana指定的引數,且必須滿足a 0。當小鳥落回地面 即...

題解 P2831 憤怒的小鳥

題目鏈結 題目大意 第一象限內有 n 個點 n leq 18 求最少要多少條形如 y ax 2 bx quad a 0,a,b,in r 的拋物線才能覆蓋所有點 狀壓 dp 分析 n 的資料範圍很小,因此我們可以考慮狀壓 dp 填表法不好做我們可以用刷表法 用 f s 表示覆蓋集合 s 內點的最小代...

P2831 憤怒的小鳥 題解

p2831 憤怒的小鳥 我們注意到 n 18 所以考慮狀壓 dp或者暴力。定義 f s 表示 s 為 1 位置上的豬已經被打掉的最少次數 顯然我們能很容易的得到轉移方程 dp 0 0 dp s line i j min dp s 1 dp s 1 i 1 min dp s 1 考慮如何優化 因為我們...