NOIP 2016 憤怒的小鳥

來源:互聯網
上載者:User

題目描述

Kiana最近沉迷於一款神奇的遊戲無法自拔。

簡單來說,這款遊戲是在一個平面上進行的。

有一架彈弓位於(0,0)處,每次Kiana可以用它向第一象限發射一隻紅色的小鳥,小鳥們的飛行軌跡均為形如y=ax^2+bx的曲線,其中a,b是Kiana指定的參數,且必須滿足a<0。

當小鳥落回地面(即x軸)時,它就會瞬間消失。

在遊戲的某個關卡裡,平面的第一象限中有n只綠色的小豬,其中第i只小豬所在的座標為(xi,yi)。

如果某隻小鳥的飛行軌跡經過了(xi,yi),那麼第i只小豬就會被消滅掉,同時小鳥將會沿著原先的軌跡繼續飛行;

如果一隻小鳥的飛行軌跡沒有經過(xi,yi),那麼這隻小鳥飛行的全過程就不會對第i只小豬產生任何影響。

例如,若兩隻小豬分別位於(1,3)和(3,3),Kiana可以選擇發射一隻飛行軌跡為y=-x^2+4x的小鳥,這樣兩隻小豬就會被這隻小鳥一起消滅。

而這個遊戲的目的,就是通過發射小鳥消滅所有的小豬。

這款神奇遊戲的每個關卡對Kiana來說都很難,所以Kiana還輸入了一些神秘的指令,使得自己能更輕鬆地完成這個遊戲。這些指令將在【輸入格式】中詳述。

假設這款遊戲一共有T個關卡,現在Kiana想知道,對於每一個關卡,至少需要發射多少只小鳥才能消滅所有的小豬。由於她不會算,所以希望由你告訴她。

輸入輸出格式
輸入格式:

第一行包含一個正整數T,表示遊戲的關卡總數。

下面依次輸入這T個關卡的資訊。每個關卡第一行包含兩個非負整數n,m,分別表示該關卡中的小豬數量和Kiana輸入的神秘指令類型。接下來的n行中,第i行包含兩個正實數(xi,yi),表示第i只小豬座標為(xi,yi)。資料保證同一個關卡中不存在兩隻座標完全相同的小豬。

如果m=0,表示Kiana輸入了一個沒有任何作用的指令。

如果m=1,則這個關卡將會滿足:至多用只小鳥即可消滅所有小豬。

如果m=2,則這個關卡將會滿足:一定存在一種最優解,其中有一隻小鳥消滅了至少只小豬。

保證1<=n<=18,0<=m<=2,0 < xi,yi < 10,輸入中的實數均保留到小數點後兩位。

上文中,符號和分別表示對c向上取整和向下取整

輸出格式:

對每個關卡依次輸出一行答案。

輸出的每一行包含一個正整數,表示相應的關卡中,消滅所有小豬最少需要的小鳥數量

輸入輸出範例

輸入範例#1:
2
2 0
1.00 3.00
3.00 3.00
5 2
1.00 5.00
2.00 8.00
3.00 9.00
4.00 8.00
5.00 5.00

輸出範例#1:
1
1

輸入範例#2:
3
2 0
1.41 2.00
1.73 3.00
3 0
1.11 1.41
2.34 1.79
2.98 1.49
5 0
2.72 2.72
2.72 3.14
3.14 2.72
3.14 3.14
5.00 5.00

輸出範例#2:
2
2
3

輸入範例#3:
1
10 0
7.16 6.28
2.02 0.38
8.33 7.78
7.68 2.09
7.46 7.86
5.77 7.44
8.24 6.72
4.42 5.11
5.42 7.79
8.15 4.99

輸出範例#3:
6

說明

【範例解釋1】

這組資料中一共有兩個關卡。

第一個關卡與【問題描述】中的情形相同,2隻小豬分別位於(1.00,3.00)和 (3.00,3.00),只需發射一隻飛行軌跡為y = -x^2 + 4x的小鳥即可消滅它們。

第二個關卡中有5隻小豬,但經過觀察我們可以發現它們的座標都在拋物線 y = -x^2 + 6x上,故Kiana只需要發射一隻小鳥即可消滅所有小豬。

【分析】
尹神orz,這題我暴搜了一個多小時搜了60,我尹60行搞定。

我的非正解方法是深搜,先預先處理出n只豬和t只小鳥的關係,如果第i只豬能被第j只小鳥砸中,那麼兩者連一條邊,問題轉化為如何用最少的小鳥點覆蓋所有的豬。然後瞎胡搜也不會剪枝,於是光榮TLE。當然某些同學也能搜出來,我不太行啊…

正解是狀壓dp。預先處理出f[i][j],表示第i只豬和第j只豬被一隻鳥打掉的同時,這隻鳥還能打到哪些豬(0表示打不到,1表示能打到,用二進位表示出來,包括i,j兩豬)。
枚舉0~1<<(n-1)的所有狀態,先找出第一隻沒有被打掉的豬k(早打晚打都要打),然後枚舉k以後的豬,相當於枚舉包含豬k的拋物線,用前面的狀態更新後面的狀態,用到或運算。

核心代碼如下dp[0]=0;fo(i,0,(1<<n)-2) //枚舉狀態{    k=0;    while((1<<k)&i) k++;k++; //第k頭豬是第一個沒有被幹掉的豬    dp[i|(1<<(k-1))]=min(dp[i|(1<<(k-1))],dp[i]+1);    fo(j,k+1,n)       dp[i|f[k][j]]=min(dp[i|f[k][j]],dp[i]+1);}dp[(1<<n)-1]即為答案

【代碼】

//NOIP 2016 憤怒的小鳥(狀壓dp)#include<cmath>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define ll long long#define M(a) memset(a,0,sizeof a)#define fo(i,j,k) for(i=j;i<=k;i++)using namespace std;const double eps=1e-10;int T,n,m;double x[20],y[20];int f[20][20],dp[1<<19];  //f[i][j]表示i,j兩豬被打下的小鳥還能打下哪只豬 inline void calc(){    int i,j,k;    fo(i,1,n)      fo(j,i+1,n)      {          double x11=x[i],y11=y[i],x22=x[j],y22=y[j];          double a=(x11*y22-x22*y11)/(x11*x22*(x22-x11));          double b=(x11*x11*y22-x22*x22*y11)/(x11*x22*(x11-x22));          if(a>=0) continue;          fo(k,1,n)          {              double tmp=a*x[k]*x[k]+b*x[k];              if(y[k]-eps<=tmp && tmp<=y[k]+eps)                 f[i][j]|=(1<<(k-1));          }      }}inline int dynamic(){    int i,j,k;    dp[0]=0;    fo(i,0,(1<<n)-2)    {        k=0;        while((1<<k)&i) k++;k++; //第k頭豬是第一個沒有被幹掉的豬        dp[i|(1<<(k-1))]=min(dp[i|(1<<(k-1))],dp[i]+1);        fo(j,k+1,n)           dp[i|f[k][j]]=min(dp[i|f[k][j]],dp[i]+1);    }    return dp[(1<<n)-1];}int main(){    int i,j;    scanf("%d",&T);    while(T--)    {            M(f);        memset(dp,0x3f,sizeof dp);        scanf("%d%d",&n,&m);        fo(i,1,n) scanf("%lf%lf",&x[i],&y[i]);        calc();        printf("%d\n",dynamic());    }    return 0;}/*15 02.72 2.722.72 3.143.14 2.723.14 3.145.00 5.00*/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.