题意

分析

看n的范围只有18,考虑状压dp。

用\(f(s)\)表示过集合s中的点所需最小的抛物线数量。

然后枚举点对算抛物线,判断其他点是否在抛物线上来转移。

细节

判断能否构成抛物线只需要判断斜率关系,具体来说是

\[\frac{y_i}{x_i} > \frac{y_j-y_i}{x_j-x_i}
\]

判断三点是否在同一抛物线上,考虑方程

\[\left\{
\begin{array}{}
a x_i^2 + bx_i & = & y_i \\
a x_j^2 + bx_j & = & y_j \\
a x_k^2 + bx_k & = & y_k \\
\end{array}
\right.
\]

有解的条件是矩阵

\[\left[
\begin{matrix}
x_i^2 & x_i & y_i \\
x_j^2 & x_j & y_j \\
x_k^2 & x_k & y_k
\end{matrix}
\right]
\]

线性相关,只需行列式为0。(B君太优秀了。)

代码

#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<complex>
#define rg register
#define il inline
#define co const
#pragma GCC optimize ("O0")
using namespace std;
template<class T> il T read(rg T&x)
{
rg T data=0;
rg int w=1;
rg char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(isdigit(ch))
data=10*data+ch-'0',ch=getchar();
return x=data*w;
}
typedef long long ll;
const int INF=0x7fffffff; const int MAXN=20;
int n,m,ms;
ll x[MAXN],y[MAXN]; int f[1<<MAXN|7]; il void update(rg co int&x)
{
for(rg int i=0;i<=ms;++i)
{
f[i|x]=min(f[i|x],f[i]+1);
// cerr<<(i|x)<<" f="<<f[i|x]<<" fi+1="<<f[i]+1<<" min="<<min(f[i|x],f[i]+1)<<endl;
} } il bool in(rg co int&i,rg co int&j,rg co int&k)
{
rg ll det=0;
det += x[i] * x[i] * x[j] * y[k];
det += x[i] * y[j] * x[k] * x[k];
det += y[i] * x[j] * x[j] * x[k];
det -= y[i] * x[j] * x[k] * x[k];
det -= x[i] * x[j] * x[j] * y[k];
det -= x[i] * x[i] * y[j] * x[k];
return det==0;
} int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
rg int T;
read(T);
while(T--)
{
memset(f,0x3f,sizeof f);
f[0]=0; // edit 1:the init of f read(n);read(m);
ms=(1<<n)-1;
for(rg int i=0;i<n;++i)
{
rg double xi,yi;
scanf("%lf %lf",&xi,&yi);
x[i] = ll(100 * xi + 0.5);
y[i] = ll(100 * yi + 0.5);
// cerr<<i<<" x="<<x[i]<<" y="<<y[i]<<endl;
} for(rg int i=0;i<n;++i)
{
update(1<<i);
for(rg int j=0;j<n;++j)
if(x[j] > x[i] && y[i] * (x[j] - x[i]) > x[i] * (y[j] - y[i]))
{
rg int s=(1<<i)|(1<<j);
for(rg int k=0;k<n;++k)
if(in(i,j,k))
s|=(1<<k);
// cerr<<i<<" "<<j<<" s="<<s<<endl;
update(s);
}
} /* for(int i=0;i<1<<n;++i)
cerr<<i<<" f="<<f[i]<<endl;*/ printf("%d\n",f[ms]);
}
// fclose(stdin);
// fclose(stdout);
return 0;
}

LG2831 愤怒的小鸟的更多相关文章

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

    [NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...

  2. 基于html5实现的愤怒的小鸟网页游戏

    之前给大家分享一款基于html5 canvas和js实现的水果忍者网页版,今天给大家分享一款基于html5实现的愤怒的小鸟网页游戏.这款游戏适用浏览器:360.FireFox.Chrome.Safar ...

  3. [luogu2831][noip d2t3]愤怒的小鸟_状压dp

    愤怒的小鸟 noip-d2t3 luogu-2831 题目大意:给你n个点,问最少需要多少条经过原点的抛物线将其覆盖. 注释:1<=点数<=18,1<=数据组数<=30.且规定 ...

  4. 洛谷P2831 愤怒的小鸟 + 篮球比赛1 2

    这三道题一起做,有一点心得吧. 愤怒的小鸟,一眼看上去是爆搜,但是实现起来有困难(我打了0分出来). 还有一种解法是状压DP. 抛物线一共只有那么多条,我们枚举抛物线(枚举两个点),这样就能够预处理出 ...

  5. Unity3D笔记 愤怒的小鸟<二> 实现Play界面

    创建Play界面.能个把各个图片组合成一个场景,场景组成后背景能够不停的滚动,当鼠标单击时显示图片手型鼠标 一.GUI Texture 1.创建背景.地面.树木.草 ,这里注意Z轴的排序,一层一层则第 ...

  6. Unity3D笔记 愤怒的小鸟<一>场景切换

    新建3个场景,场景1 Start 十秒后自动切换到场景2 Splash,场景2在二秒后自动切换到场景3 Selection 一.场景一Start 二.场景2 Splash 三.场景3 Selectio ...

  7. Unity3D游戏-愤怒的小鸟游戏源码和教程(二)

    Unity愤怒的小鸟游戏教程(二) 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) AngryEva游戏效果 ...

  8. Unity3D游戏-愤怒的小鸟游戏源码和教程(一)

    Unity愤怒的小鸟游戏教程 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) AngryEva游戏效果: 1 ...

  9. 【NOIP2016提高组】 Day2 T3 愤怒的小鸟

    题目传送门:https://www.luogu.org/problemnew/show/P2831 说个题外话:NOIP2014也有一道题叫做愤怒的小鸟. 这题自测时算错了eps,导致被卡了精度,从1 ...

随机推荐

  1. 《Python网络编程基础》第四章 域名系统

    域名系统(DNS) 是一个分布式的数据库,它主要用来把主机名转换成IP地址.DNS以及相关系统之所以存在,主要有以下两个原因:   它们可以使人们比较容易地记住名字,如www.baidu.com. 它 ...

  2. Mist 转移默认区块存储位置方法

    http://8btc.com/thread-35325-1-1.html 看了bunaifeiqq 发的帖子“Mist 转移区块存储位置方法”,综合帖子下面的发言,自己做了测试,可行.电脑系统win ...

  3. Android SurfaceView入门学习

    学习资料: Android 开发群英传 搜索学习资料时,搜到了罗升阳老师的Android视图SurfaceView的实现原理分析,老罗老师写的一系列博客,一年前开始学习Android时看不懂,现在依然 ...

  4. shell给tcp或udp服务发送16进制报文指令

    指令:(sleep 2;echo "000F737D61747573" | xxd -r -p ;sleep 1)|nc 192.168.137.1 15000|hexdump - ...

  5. FromBottomToTop第十一周项目博客

    FromBottomToTop第十一周项目博客 项目内容 塔防游戏 大体就是在地图上以合理阵型建设防御炮塔来阻止小怪进入我方阵地.玩家需用现有的金币进行炮台建设或升级,金币数可根据打怪个数增加.入侵的 ...

  6. Nginx反向代理缓冲区优化

    内容目录 proxy_buffering proxy_buffer_size proxy_buffers proxy_busy_buffers_size proxy_max_temp_file_siz ...

  7. .Net t图片生成水印

    借鉴于博客园园友的方法,大神神风(https://www.cnblogs.com/tandyshen/archive/2012/04/14/picwater.html) ,很实用的一种 自定义水印方法 ...

  8. Android -- service 利用广播调用服务的方法

    1. 实现原理,在Service里面注册一个广播接收者, 想要调用的时候app发送出广播, 后台的service里面的广播接收者接收到广播,并调用service里面的方法. 2. 示例代码 MainA ...

  9. [原][译][osgearth][EarthFile]关于EarthFile 的Model Layer 讲解(通过earth文件加载模型层)(OE官方文档翻译)

    原文参考:http://docs.osgearth.org/en/latest/references/earthfile.html#model-layer 本人翻译能有限.... 模型层 模型层渲染“ ...

  10. Java网络编程学习A轮_06_NIO入门

    参考资料: 老外写的教程,很适合入门:http://tutorials.jenkov.com/java-nio/index.html 上面教程的译文:http://ifeve.com/overview ...