题意

分析

看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. hdu 5140 主席树

    这题说的是每个员工有工资 水平 在公司待的年限这几个属性,有大量的查询 查的是在一定的水平和工作年限的工人总工资是多少 这个思路是比较简单的我们按照他们的水平排序,排完后,使用主席树不断地往里面插,然 ...

  2. P1270 “访问”美术馆(树形dp)

    P1270 “访问”美术馆 艺术馆最多有100个展室 ------> 节点数$<=100*2<2^{8}=256$ 所以可以开一个$f[i][j]$表示到第$i$个点为止花去$j$分 ...

  3. POI之Excel导出

    1,在maven的pom文件中添加依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId& ...

  4. Sublime Text3编辑器简介

    Sublime Text3编辑器简介 下载地址 绿色中文版v3.3038下载地址:http://www.cncrk.com/downinfo/60832.html 官方网址(英文安装版)下载地址:ht ...

  5. linux下mysql数据库导入导出命令

    首先linux 下查看mysql相关目录root@ubuntu14:~# whereis mysqlmysql: /usr/bin/mysql----   mysql的运行路径 /etc/mysql ...

  6. 20135320赵瀚青LINUX第七周学习笔记

    赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 本周学习的内容主要是讨 ...

  7. linux内核启动时报错ubi0 error: validate_ec_hdr: bad data offset 256, expected 128

    1.错误解析 ubi的EC header中有一个字段data_offset来记录数据偏移,数据偏移必须正确才能正确读取每一个物理擦除块中的数据 2.解决方法 擦除整块flash,然后再重新烧写包含ub ...

  8. 测试工程师 技能要求:java编程,数据库,linux操作系统,自动化测试开发,性能测试,安全测试

    1.具有开发和测试经验,能负责带领大型项目测试 2.掌握或熟悉java编程,熟悉mysql,oracle等db,memcache,nosql等,有互联网行业从业经验 3.可撰写自动化测试工具以及搭建自 ...

  9. C++ 构造函数后加冒号

    其实冒号后的内容是初始化成员列表,一般有三种情况: 1.对含有对象成员的对象进行初始化,例如, 类line有两个私有对象成员startpoint.endpoint,line的构造函数写成: line( ...

  10. angular的 表单

    一般来讲表单可能遇到的问题:1.如何数据绑定.2.验证表单.3.显示出错信息.4.整个form的验证.5.避免提交没有验证通过的表单.6.防止多系提交. input属性:nameng-modelng- ...