看了題解之後知道,是狀壓dp。
一、首先預處理乙個$2^n$次方的fpow陣列
fpow[0]=1二、然後預處理乙個sta[i][j],表示經過o,i,j三點的那條拋物線經過的所有的點的狀態,處理時要注意:;for(rint i=1;i<=19;i++)fpow[i]=(fpow[i-1]<<1);
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#includeac**#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;
}
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 並保證所有的長度都是非...