NOIP2016 憤怒的小鳥

2022-05-26 19:30:15 字數 3914 閱讀 4195

題目描述description

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

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

有一架彈弓位於 (0,

0)'>(0,0)

處,每次 kiana 可以用它向第一象限發射乙隻紅色的小鳥,小鳥們的飛行軌跡均為形如 y=a

x2+b

x'>y=ax^2+bx

的曲線,其中 a,b

'>a,b

是 kiana 指定的引數,且必須滿足 a

<

0'>a<0,a,

b'>a,b

都是實數。

當小鳥落回地面(即 x

'>x

軸)時,它就會瞬間消失。

在遊戲的某個關卡裡,平面的第一象限中有 n

'>n

只綠色的小豬,其中第 i

'>i

i 只小豬所在的座標為 (xi

,yi)

'>(xi,yi)

。如果某只小鳥的飛行軌跡經過了 (xi

,yi)

'>(xi,yi)

,那麼第 i

'>i

只小豬就會被消滅掉,同時小鳥將會沿著原先的軌跡繼續飛行;

如果乙隻小鳥的飛行軌跡沒有經過 (xi

,yi)

'>(xi,yi)

,那麼這只小鳥飛行的全過程就不會對第 i

'>i

i 只小豬產生任何影響。

例如,若兩隻小豬分別位於 (1,

3)'>(1,3)

和 (3,3

)'>(3,3)

,kiana 可以選擇發射乙隻飛行軌跡為 y=−

x2+4

x'>y=−x^2+4x

的小鳥,這樣兩隻小豬就會被這只小鳥一起消滅。

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

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

假設這款遊戲一共有 t

'>t

個關卡,現在 kiana 想知道,對於每乙個關卡,至少需要發射多少只小鳥才能消滅所有的小豬。由於她不會算,所以希望由你告訴她。

輸入描述input description

從標準輸入讀入資料。

第一行包含乙個正整數 t

'>t

,表示遊戲的關卡總數。

下面依次輸入這 t

'>t

個關卡的資訊。每個關卡第一行包含兩個非負整數 n,m

'>n,m

,分別表示該關卡中的小豬數量和 kiana 輸入的神秘指令型別。接下來的 n

'>

n 行中,第 i

'>i

行包含兩個正實數 xi,

yi'>xi,yi

,表示第 i

'>i

i 只小豬座標為 (xi

,yi)

'>(xi,yi)

。資料保證同乙個關卡中不存在兩隻座標完全相同的小豬。

如果 m=0

'>m=0

,表示 kiana 輸入了乙個沒有任何作用的指令。

如果 m=1

'>m=1

,則這個關卡將會滿足:至多用 ⌈n/

3+1⌉

'>⌈n/3+1⌉

只小鳥即可消滅所有小豬。

如果 m=2

'>m=2

,則這個關卡將會滿足:一定存在一種最優解,其中有乙隻小鳥消滅了至少 ⌊n/

3⌋'>⌊n/3⌋

只小豬。

保證 1≤n

≤18'>1≤n≤18,0≤

m≤2'>0≤m≤2

,0,y

i<

10'>0

,輸入中的實數均保留到小數點後兩位。

上文中,符號 ⌈c⌉

'>⌈c⌉

和 ⌊c

⌋'>⌊c⌋ 分別表示對 c

'>c

向上取整和向下取整,例如:⌈

2.1⌉=⌈

2.9⌉=⌈

3.0⌉=⌊

3.0⌋=⌊

3.1⌋=⌊

3.9⌋=3

'>⌈2.1⌉=⌈2.9⌉=⌈3.0⌉=⌊3.0⌋=⌊3.1⌋=⌊3.9⌋=3。

輸出描述output description

輸出到標準輸出。

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

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

樣例輸入sample input

2
2 01.00 3.00

3.00 3.00

5 21.00 5.00

2.00 8.00

3.00 9.00

4.00 8.00

5.00 5.00

樣例輸出sample output

1
1資料範圍及提示data size & hint

之前的一些廢話:我是來填最近幾周做題沒寫部落格的坑的。

題解:看到資料範圍那麼小不是狀壓就是暴搜了。但是狀態壓縮一般比較穩,於是決定寫狀壓。開始十分幼稚的認為一條拋物線至少能乾掉兩頭豬,後來才發現有些情況拋物線a<0,即反重力,是不行的。我們設v(i,j)表示打i,j兩頭豬的拋物線所能打到所有豬的集合,先推一推式子,判斷第三個點是否在拋物線上(注意浮點誤差),這個過程用o(n^3)的時間就能搞定,之後我們就可以dp了,設f(s)表示打死集合s的最少次數,轉移的話首先列舉兩頭沒打過的豬,然後轉移方程是dp[s|v[i][j]]=min(dp[s|v[i][j]],dp[s]+1),然後再列舉打死一頭豬的,轉移為

dp[s|(1

**:

#include#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;typedef pair

pdd;

#define mem(a,b) memset(a,b,sizeof(a))inline

intread()

while(isdigit(c))

return x*f;

}#define x first

#define y second

const

int maxn=20

;const

double eps=1e-12

;pdd p[maxn];

int t,n,m,dp[1

<

bool isline(int a,int b,int

c)int

main()

if(n<=1)

for(int s=0;s<=all;s++)

printf(

"%d\n

",dp[all]);

}return0;

}

view code

總結:一定要小心浮點誤差。

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