憤怒的小鳥
description:
給你\(n<=18\)個小豬,發射的小鳥軌跡為拋物線,求最小用多少個小鳥可以將小豬全部乾掉
看到n很小,我想到了搜尋,於是我用\(dfs\)列舉出,每個拋物線打掉的小豬集合然後判斷他的合法性,結果tle成了50分,mmp,瞄了一眼題解,看到他是列舉小豬,來確定拋物線,感覺妙了很多,於是我寫了如下的
code:#include#include#includeusing namespace std;
const double eps=0.0000001;
int t,n,m,ans;
double x[20],y[20],a[20],b[20];
bool vis[20];
inline double fabs(double x)
inline void dfs(int pos,int num,int cnt)
bool flag=0;
for(int i=1;i<=num;++i)
}if(flag)return ;
for(int i=1;i=0)continue;//不可行
a[num+1]=aa;
b[num+1]=bb;//可行
vis[i]=vis[pos]=1;//不獨立了
dfs(pos+1,num+1,cnt-2);
a[num+1]=0;
b[num+1]=0;
vis[i]=vis[pos]=0;//回溯
}dfs(pos+1,num,cnt);//自己獨立
}int main()dfs(pos+1,num+1,cnt-2)\textdfs(pos+1,num,cnt)\)
\(num+cnt\)的總和是變小了,如果使用最優性剪枝,有可能將最優值剪掉
仔細比較題解和我的**,他並不是把所有的小豬剛開始都變成獨立的,這樣對於乙個新小豬,他的code
\(dfs(pos+1,num,cnt)\text dfs(pos+1,num+1,cnt-1)\textdfs(pos+1,num,cnt+1)\)
\(num+cnt\)的總和單調不降,可以使用最優性剪枝
我是上來就把所有小豬看成獨立,而他是將小豬後放進去
code:#include#include#include#includeusing namespace std;
const double eps=1e-8;
int t,n,m,ans;
double x[20],y[20],a[20],b[20],xx[20],yy[20];
inline void dfs(int pos,int num,int cnt)//邊界
bool flag=0;
for(int i=1;i<=num;++i)
xx[i]=va;
yy[i]=vb;
}xx[cnt+1]=x[pos];
yy[cnt+1]=y[pos];
dfs(pos+1,num,cnt+1);//自己獨立
}}int main(){
scanf("%d",&t);
for(int i=1;i<=t;++i){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)scanf("%lf%lf",&x[i],&y[i]);
ans=0x3f3f3f3f;
dfs(1,0,0);
cout《搜尋:狀態要定好,剪枝要想好
NOIP 2016 憤怒的小鳥
題目描述 kiana最近沉迷於一款神奇的遊戲無法自拔。簡單來說,這款遊戲是在乙個平面上進行的。有一架彈弓位於 0,0 處,每次kiana可以用它向第一象限發射乙隻紅色的小鳥,小鳥們的飛行軌跡均為形如y ax 2 bx的曲線,其中a,b是kiana指定的引數,且必須滿足a 0。當小鳥落回地面 即x軸 ...
NOIP2016 憤怒的小鳥
時間限制 1 sec 記憶體限制 128 mb kiana最近沉迷於一款神奇的遊戲無法自拔。簡單來說,這款遊戲是在乙個平面上進行的。有一架彈弓位於 0,0 處,每次kiana可以用它向第一象限發射乙隻紅色的小鳥,小鳥們的飛行軌跡均為形如y ax 2 bx的曲線,其中a,b是kiana指定的引數,且必...
NOIP2016 憤怒的小鳥
這道題看到資料範圍,我們就知道 小於等於18,一定使用狀態壓縮,即o 2 n 乙個東西 在算一下,我們發現,像noip這種考試,一定會考卡常數的題,所以瞬間得出這道題的演算法是o 2 n n 2 cases 顯然這道題我們可以當做直線來做 y a x 2 b x可以合併同類項得y x a x b 那...