NOIP2016 D2 T3 憤怒的小鳥

2022-05-25 11:36:11 字數 1641 閱讀 6985

看了題解之後知道,是狀壓dp。

一、首先預處理乙個$2^n$次方的fpow陣列

fpow[0]=1

;for(rint i=1;i<=19;i++)fpow[i]=(fpow[i-1]<<1);

二、然後預處理乙個sta[i][j],表示經過o,i,j三點的那條拋物線經過的所有的點的狀態,處理時要注意:

1、拋物線的$a$值大於等於0的要剔除

2、橫座標相同的兩點不可能在同一條拋物線上

3、注意精度

處理完後就可以狀壓dp了。

三、dp時首先把dp值賦為inf

方程:

chkmin(dp[i|sta[j][k]],dp[i]+1)
四、最後的優化:

1、就是我們沒有必要列舉所有的$i$,其實不論如何,在$dp[i]$中第乙個沒有出現的豬,我們最後一定要打的,所以我們乾脆就只列舉最後那個豬,這樣可以快一點

2、找到第一只沒打過的豬後,只需要列舉從它開始剩下的豬即可,不要從1開始:

for(rint k=j+1;k<=n;k++)
五、attention!(洛谷ac,uoj wa)

假如得了97分的話,估計是精度問題

判斷a的正負時要if(a

判斷是否是同一解要if(abs(...)<=1e-12)

否則會炸extra test

六、最後上ac**:

#include#include

#include

#include

#include

#include

#define rint register int

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

using

namespace

std;

template

inline

void read(t &x)

template

inline t min(t &x,t &y)

template

inline

void chkmin(t &x,t y)

inline

double abs(double x)

const

int maxn=23,inf=0x3f3f3f3f

;const

double eps=1e-12,eeps=-1e-6

;int fpow[21

];int n,m,sta[maxn][maxn],dp[1

<

double

x[maxn],y[maxn];

inline

void

init()

inline

void update_sta(int a,int

b)int

main()

chkmin(dp[i|fpow[j-1]],dp[i]+1

);

break

; }}}

printf(

"%d\n

",dp[fpow[n]-1

]); }

return0;

}

ac**

NOIP 2016 Day2 T3 憤怒的小鳥

kiana 最近沉迷於一款神奇的遊戲無法自拔。簡單來說,這款遊戲是在乙個平面上進行的。有一架彈弓位於 0,0 處,每次 kiana 可以用它向第一象限發射乙隻紅色的小鳥,小鳥們的飛行軌跡均為形如 y ax 2 bx 的曲線,其中 a,b 是 kiana 指定的引數,且必須滿足 a 0,a,b 都是實...

NOIP2016 T6 憤怒的小鳥

仔細思考可以發現,這個題目應該是可以狀壓dp的。又是dp 今年考了兩道dp,還都是新型別 f s 表示被覆蓋的狀態為s的最少豬數,然後預處理乙個g i j 表示選擇了i和j之後的拋物線經過的豬的狀態集合 是乙個01狀態 如g 3 5 21 10 10101 2 表示經過第3 5只豬的拋物線可以打到第...

蚯蚓 NOIP2016D2T2 單調佇列

本題中,我們將用符號 c 表示對c向下取整,例如 3.0 3.1 3.9 3。蛐蛐國最近蚯蚓成災了!隔壁跳蚤國的跳蚤也拿蚯蚓們沒辦法,蛐蛐國王只好去請神刀手來幫他們消滅蚯蚓。蛐蛐國裡現在共有n只蚯蚓 n為正整數 每只蚯蚓擁有長度,我們設第i只蚯蚓的長度為a i i 1,2,n 並保證所有的長度都是非...