[luoguP2831] 愤怒的小鸟(状压DP)

传送门

感觉这题不是很难,但是很恶心。

说一下几点。

1.预处理出来每两个点所构成的抛物线能消除的猪的集合。

2.如果两个点横坐标相同,则不能构成抛物线

3.a >= 0 continue

4.卡精度

5.卡常数(本蒟蒻巨菜,2nn2做法)

#include <cstdio>
#include <cstring>
#define N 19
#define abs(x) ((x) < 0 ? -(x) : (x))
#define min(x, y) ((x) < (y) ? (x) : (y))

int T, n, m, S;
int f[1 << N], s[N][N];
double X[N], Y[N], a, b;

inline bool pd(double x, double y)
{
	return abs(x - y) < (1e-6);
}

int main()
{
	int i, j, k, l;
	scanf("%d", &T);
	while(T--)
	{
		scanf("%d %d", &n, &m);
		memset(f, 127 / 3, sizeof(f));
		for(i = 1; i <= n; i++) scanf("%lf %lf", &X[i], &Y[i]);
		memset(s, 0, sizeof(s));
		for(i = 1; i <= n; i++)
			for(j = i + 1; j <= n; j++)
			{
				if(pd(X[i], X[j])) continue;
				a = (Y[j] / X[j] - Y[i] / X[i]) / (X[j] - X[i]);
                b = Y[i] / X[i] - a * X[i];
				if(a >= 0) continue;
				s[i][j] |= (1 << i - 1) | (1 << j - 1);
				for(k = 1; k <= n; k++)
					if(k != i && k != j && pd(Y[k], a * X[k] * X[k] + b * X[k]))
						s[i][j] |= 1 << k - 1;
			}
		f[0] = 0;
		for(i = 0; i < (1 << n); i++)
			for(j = 1; j <= n; j++)
				if(!(i & (1 << j - 1)))
				{
					f[i | (1 << j - 1)] = min(f[i | (1 << j - 1)], f[i] + 1);
					for(k = j + 1; k <= n; k++)
						if((i & (1 << k - 1)) && s[j][k])
						{
							S = i ^ (i & s[j][k]);
							f[i | (1 << j - 1)] = min(f[i | (1 << j - 1)], f[S] + 1);
						}
				}
		printf("%d\n", f[(1 << n) - 1]);
	}
	return 0;
}

  

时间: 2024-10-19 11:50:32

[luoguP2831] 愤怒的小鸟(状压DP)的相关文章

[NOIP2016]愤怒的小鸟 D2 T3 状压DP

[NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可以用它向第一象限发射一只红色的小鸟,小鸟们的飞行轨迹均为形如y=ax2+bx的曲线,其中a,b是Kiana指定的参数,且必须满足a<0. 当小鸟落回地面(即x轴)时,它就会瞬间消失. 在游戏的某个关卡里,平面的第一象限中有n只绿色的小猪,其中第i只小猪所在的坐标为(xi,yi). 如果某只小鸟的飞行

ZOJ3305Get Sauce 状压DP,

状压DP的题目留个纪念,首先题意一开始读错了,搞了好久,然后弄好了,觉得DFS可以,最后超时,修改了很久还是超时,没办法看了一下n的范围,然后觉得状压可以,但是没有直接推出来,就记忆化搜索了一下,可是一直错,莫名奇妙,然后没办法看了一下题解,发现了下面这个比较好的方法,然后按照这个方程去推,然后敲,也是WA了好多把,写的太搓了,没人家的清楚明了,唉~也算是给自己留个纪念,状压一直做的都不太好~唉~还好理解了, 参考了  http://blog.csdn.net/nash142857/articl

poj 2411 Mondriaan&#39;s Dream(状压DP)

Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 12232   Accepted: 7142 Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his 'toilet series

(状压dp)uva 10817 Headmaster&#39;s Headache

题目地址 1 #include <bits/stdc++.h> 2 typedef long long ll; 3 using namespace std; 4 const int MAX=1e5+5; 5 const int INF=1e9; 6 int s,m,n; 7 int cost[125]; 8 //char sta[MAX]; 9 string sta; 10 int able[125]; 11 int dp[125][1<<8][1<<8]; 12 in

HDU5816 Hearthstone(状压DP)

题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5816 Description Hearthstone is an online collectible card game from Blizzard Entertainment. Strategies and luck are the most important factors in this game. When you suffer a desperate situation an

HDU 4336 容斥原理 || 状压DP

状压DP :F(S)=Sum*F(S)+p(x1)*F(S^(1<<x1))+p(x2)*F(S^(1<<x2))...+1; F(S)表示取状态为S的牌的期望次数,Sum表示什么都不取得概率,p(x1)表示的是取x1的概率,最后要加一因为有又多拿了一次.整理一下就可以了. 1 #include <cstdio> 2 const int Maxn=23; 3 double F[1<<Maxn],p[Maxn]; 4 int n; 5 int main() 6

Travel(HDU 4284状压dp)

题意:给n个城市m条路的网图,pp在城市1有一定的钱,想游览这n个城市(包括1),到达一个城市要一定的花费,可以在城市工作赚钱,但前提有工作证(得到有一定的花费),没工作证不能在该城市工作,但可以走,一个城市只能工作一次,问pp是否能游览n个城市回到城市1. 分析:这个题想到杀怪(Survival(ZOJ 2297状压dp) 那个题,也是钱如果小于0就挂了,最后求剩余的最大钱数,先求出最短路和 Hie with the Pie(POJ 3311状压dp) 送披萨那个题相似. #include <

BZOJ 1087: [SCOI2005]互不侵犯King( 状压dp )

简单的状压dp... dp( x , h , s ) 表示当前第 x 行 , 用了 h 个 king , 当前行的状态为 s . 考虑转移 : dp( x , h , s ) = ∑ dp( x - 1 , h - cnt_1( s ) , s' ) ( s and s' 两行不冲突 , cnt_1( s ) 表示 s 状态用了多少个 king ) 我有各种预处理所以 code 的方程和这有点不一样 ------------------------------------------------

BZOJ 1072 排列 状压DP

题意:链接 方法:状压DP? 题解:这题其实没啥好写的,不算很难,推一推就能搞出来. 首先看到这个问题,对于被d整除这个条件,很容易就想到是取余数为0,所以想到可能状态中刚开始含有取余数. 先说我的第一个想法,f[i][j]表示选取i个数且此时的mod为j,这样的思想是第一下蹦出来的,当时想的就是在线来搞最终的答案.不过转瞬即发现,这TM不就是暴力吗魂淡!并没有什么卵用,于是开始想这个状态可不可以做什么优化. 显然第二维的j并不需要太大的优化,暂且先将其搁置一边,来考虑第一维的i怎么优化. 把滚

COdeforces#417D Cunning Gena(状压DP)

A boy named Gena really wants to get to the "Russian Code Cup" finals, or at least get a t-shirt. But the offered problems are too complex, so he made an arrangement with his n friends that they will solve the problems for him. The participants