NOIP憤怒的小鳥

2022-08-17 14:15:19 字數 1718 閱讀 9432

憤怒的小鳥

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 那...