【题解】P2831 愤怒的小鸟 - 状压dp
P2831愤怒的小鸟
题目描述
\(Kiana\) 最近沉迷于一款神奇的游戏无法自拔。
简单来说,这款游戏是在一个平面上进行的。
有一架弹弓位于 \((0,0)\) 处,每次 \(Kiana\) 可以用它向第一象限发射一只红色的小鸟,小鸟们的飞行轨迹均为形如 \(y=a*x^2+b*x\) 的曲线,其中 \(a,b\) 是 \(Kiana\) 指定的参数,且必须满足 \(a<0\),\(a,b\) 都是实数。
当小鸟落回地面(即 \(x\) 轴)时,它就会瞬间消失。
在游戏的某个关卡里,平面的第一象限中有 \(n\) 只绿色的小猪,其中第 \(i\) 只小猪所在的坐标为 \((x_i,y_i )\)。
如果某只小鸟的飞行轨迹经过了 \((x_i,y_i )\),那么第 \(i\) 只小猪就会被消灭掉,同时小鸟将会沿着原先的轨迹继续飞行;
如果一只小鸟的飞行轨迹没有经过 \((x_i,y_i )\),那么这只小鸟飞行的全过程就不会对第 \(i\) 只小猪产生任何影响。
例如,若两只小猪分别位于 \((1,3)\) 和 \((3,3)\),\(Kiana\) 可以选择发射一只飞行轨迹为 \(y=−x^2+4*x\) 的小鸟,这样两只小猪就会被这只小鸟一起消灭。
而这个游戏的目的,就是通过发射小鸟消灭所有的小猪。
这款神奇游戏的每个关卡对 \(Kiana\) 来说都很难,所以 \(Kiana\) 还输入了一些神秘的指令,使得自己能更轻松地完成这个游戏。这些指令将在【输入格式】中详述。
假设这款游戏一共有 \(T\) 个关卡,现在 \(Kiana\) 想知道,对于每一个关卡,至少需要发射多少只小鸟才能消灭所有的小猪。由于她不会算,所以希望由你告诉她。
Solution
· 按照初(数)步(据)想(范)法(围),可以很容易就想到设一个集合表示每只猪的状态 即 \(f_S\) 表示状态为 \(S\) 时最少抛物线数
· 可以发现由于必须过原点,所以只用再确定两只猪就可以确 定一条抛物线
· 于是我们可以预处理出 \(l_{i,j}\) 表示在 \(i\) 和 \(j\) 所过的这条 抛物线上的所有猪的集合
· 这样子就很方便了
· 枚举 \(S\),对于每个 \(S\) 枚举 \(i\) 和 \(j\) 则有 : $$f[S\ | \ l_{i,j}] = min(f[S\ |\ l_{i,j}], f_S + 1)$$
· 于是愉快地(?)完成了这道题了
· 算算复杂度...\(O(2^n*n^2)≈8*10^7\)...貌似只能卡常卡过去?有没有优化呢?
· 令 \(x\) 为 \(S\) 内未被打掉的猪中编号最小的,则由 \(S\) 扩展的所有的线都要经过 \(x\)
· 这样子为什么是对的呢?
· 如果说先不打 \(x\),打了 \(x\) 之后的 \(y\) 和 \(z\),那么总要返回来再打一次 \(x\),这样子转移就重复了(虽然仍然是正确的)
· 那么就只用枚举一个 \(j\) 就可以了,转移的速度是 \(O(n)\)的,那么总复杂度为 \(O(2^n*n)≈4*10^6\),顺利跑过啦~
· 顺带一提的是 这道题可以用爆搜+剪枝,而且貌似比dp还要快一点...有兴趣的可以想一想2333
Code
#include<bits/stdc++.h>
#define ld long double
#define F(i, x, y) for(int i = x; i <= y; ++ i)
using namespace std;
const int N = 20;
const double eps = 1e-8; //由于浮点数不太好比大小,所以如果两数之差小于这个超小值则算它们相等
int n, m, all, t;
struct pig{
long double x, y;
}p[N];
int l[N][N];
int d[(1 << N)];
int f[(1 << N)];
int main()
{
scanf("%d", &t);
F(i, 0, 1 << 19)
F(j, 1, 19)
if(! (i & (1 << j - 1)))
{
d[i] = j;
break;
}
while(t --)
{
scanf("%d%d", &n, &m), all = (1 << n) - 1;
F(i, 1, n) scanf("%Lf%Lf", &p[i].x, &p[i].y);
memset(l, 0, sizeof(l));
memset(f, 127, sizeof(f)), f[0] = 0;
F(i, 1, n)
F(j, 1, n)
{
if(fabs(p[i].x - p[j].x) < eps) continue;
ld a = (p[j].x * p[i].y - p[i].x * p[j].y) / (p[i].x * p[j].x * (p[i].x - p[j].x));
ld b = p[i].y / p[i].x - a * p[i].x;
if(a > -eps) continue;
F(k, 1, n)
if(fabs(a * p[k].x * p[k].x + b * p[k].x - p[k].y) < eps)
l[i][j] |= (1 << k - 1);
}
F(i, 0, all)
{
int j = d[i];
f[i | (1 << j - 1)] = min(f[i | (1 << j - 1)], f[i] + 1);
F(k, 1, n) f[i | l[j][k]] = min(f[i | l[j][k]], f[i] + 1);
}
printf("%d\n", f[(1 << n) - 1]);
}
return 0;
}
【题解】P2831 愤怒的小鸟 - 状压dp的更多相关文章
- [Luogu P2831] 愤怒的小鸟 (状压DP)
题面: 传送门:https://www.luogu.org/problemnew/show/P2831 Solution 首先,我们可以先康一康题目的数据范围:n<=18,应该是状压或者是搜索. ...
- 洛谷P2831 愤怒的小鸟(状压dp)
题意 题目链接 Sol 这题....我样例没过就A了??..算了,就当是样例卡精度吧.. 直接状压dp一下,\(f[sta]\)表示干掉\(sta\)这个集合里面的鸟的最小操作数 转移的时候判断一下一 ...
- P2831 愤怒的小鸟 状压dp
这个题主要是预处理比较复杂,先枚举打每只鸟用的抛物线,然后找是否有一个抛物线经过两只鸟,然后就没了. 题干: 题目描述 Kiana 最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上 ...
- NOIP2016愤怒的小鸟 题解报告 【状压DP】
题目什么大家都清楚 题解 我们知道,三点确定一条抛物线,现在这条抛物线过原点,所以任意两只猪确定一条抛物线.通过运算的出对于两头猪(x1,y1),(x2,y2),他们所在抛物线a=(y1*x2-y2* ...
- NOIP2016愤怒的小鸟 [状压dp]
愤怒的小鸟 题目描述 Kiana 最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于 (0,0) 处,每次 Kiana 可以用它向第一象限发射一只红色的小鸟, ...
- NOIP2017 宝藏 题解报告【状压dp】
题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中的宝藏.但是 ...
- luogu2831 [NOIp2016]愤怒的小鸟 (状压dp)
由范围可以想到状压dp 两个点(再加上原点)是可以确定一个抛物线的,除非它们解出来a>=0,在本题中是不合法的 这样的话,我们可以预处理出由任意两个点确定的抛物线所经过的所有的点(要特别规定一下 ...
- [noip2016]愤怒的小鸟<状压dp+暴搜>
题目链接:https://vijos.org/p/2008 现在回过头去看去年的考试题,发现都不是太难,至少每道题都有头绪了... 这道题的数据范围是18,这么小,直接暴力呗,跑个暴搜就完了,时间也就 ...
- 7月15日考试 题解(链表+状压DP+思维题)
前言:蒟蒻太弱了,全打的暴力QAQ. --------------------- T1 小Z的求和 题目大意:求$\sum\limits_{i=1}^n \sum\limits_{j=i}^n kth ...
随机推荐
- SVM支持向量机——核函数、软间隔
支持向量机的目的是寻找一个能讲两类样本正确分类的超平面,很多时候这些样本并不是线性分布的. 由此,可以将原始特征空间映射到更高维的特征空间,使其线性可分.而且,如果原始空间是有限维,即属性数量有限, ...
- 学界!关于GAN的灵魂七问
根据一些指标显示,关于生成对抗网络(GAN)的研究在过去两年间取得了本质的进步.在图像合成模型实践中的进步快到几乎无法跟上. 但是,根据其他指标来看,实质性的改进还是较少.例如,在应如何评价生成对抗网 ...
- 用FME处理物探点表和线表,生成管线和设施
在项目的数据处理中,客户会提供物探点表和线表. 点表主要包括该点的物探编号.该点的X坐标.Y坐标.点的其他属性 线表主要包括该线的起始点物探编号.终止物探编号.线的其他属性 点表
- Spring Boot熟稔于心的20个常识
1.什么是 Spring Boot? Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供 ...
- 在线诊断工具arthas (windows)
介绍: arthas是阿里巴巴开发的一款开源的,Java应用程序排查问题的非常好用的工具 当你遇到以下类似问题而束手无策时 arthas 可以帮助你解决: 这个类从哪个 jar 包加载的?为什么会报各 ...
- 玩转控件:封装Dev的SearchLookupEdit
鸣谢 随着前面几个章节对控件封装与扩展的分享,不少小伙伴儿们在作者公众号上反馈,并联系作者,表示通过这些系列和源码能学到不少细节上的东西,并运用到了自己的实际项目当中,也有不少伙伴儿反馈更好更优的处理 ...
- 1013 Battle Over Cities (25 分)
It is vitally important to have all the cities connected by highways in a war. If a city is occupied ...
- PTA数据结构与算法题目集(中文) 7-20
PTA数据结构与算法题目集(中文) 7-20 7-20 表达式转换 (25 分) 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个 ...
- 面试官: 说说你对async的理解
大家好,我是小雨小雨,致力于分享有趣的.实用的技术文章. 内容分为翻译和原创,如果有问题,欢迎随时评论或私信,希望和大家一起进步. 分享不易,希望能够得到大家的支持和关注. TL;DR async是g ...
- HTTP Session例子
HTTP协议是“一次性单向”协议.服务端不能主动连接客户端,只能被动等待并答复客户端请求.客户端连接服务端,发出一个HTTP Request,服务端处理请求,并且返回一个HTTP Response给客 ...