傳送門
看到資料範圍就知道是搜尋或狀壓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 考慮如何優化 因為我們...