題目描述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
22 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
11資料範圍及提示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#includeview code#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;
}
總結:一定要小心浮點誤差。
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 那...