Noip2016Day2T3 愤怒的小鸟
problem
平面内有n个点,每次可以确定一条过原点且开口向上的抛物线,将这条抛物线上所有的点都删去。问最少需要删几次可以删掉全部的点。
solution
n比较小,直接状压一下。因为已经确定了要过原点。所以每两个点都可以确定一条抛物线。预处理出所有抛物线以及每条抛物线可以删掉的点。
然后记忆化搜索,枚举每次选择的抛物线。转移即可。
注意精度!
确定抛物线的方法就用解二元一次方程组的方法即可。具体如下:
设抛物线的二次项系数为\(a\),一次项系数为\(b\) ,两个点的坐标分别为\((x_i,y_i),(x_j,y_j)\)。
记\(k_1=x_i^2,k_2=x_i,k_3=y_i,k_4=x_j^2,k_5=x_j,k_6=y_j\)
然后就是解方程组
\begin{aligned}
k_1a+k_2b=k_3& &(1)\\
k_4a+k_5b=k_6& &(2)
\end{aligned}
\right.
\]
由\((1)\)得\(b=\frac{k_3-k_1a}{k_2}\),代回\((2)\)得\(a=\frac{k_2k_6-k_3k_5}{k_2k_4-k_1k_5}\)
code
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
typedef long long ll;
const double eps = 1e-9;
ll read() {
ll x = 0,f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
x = x * 10 + c - '0';
c = getchar();
}
return x * f;
}
int tot;
bool calc(double a,double b,double x,double y) {
return fabs(a * x * x + b * x - y) <= eps;
}
double x[20],y[20],a[400],b[400];
int sol[400];
int n,m,f[1 << 20];
int dfs(int now) {
if(!now) return f[now] = 0;
if(f[now] != -1) return f[now];
int ret = 100000;
for(int i = 1;i <= tot;++i) {
int t = now & sol[i];
if(t != now) ret = min(ret,dfs(t) + 1);
}
return f[now] = ret;
}
int main() {
int T = read();
while(T--) {
tot = 0;
memset(f,-1,sizeof(f));
n = read(),m = read();
for(int i = 1;i <= n;++i) scanf("%lf%lf",&x[i],&y[i]);
for(int i = 1;i <= n;++i) {
for(int j = i + 1;j <= n;++j) {
if(fabs(x[i] - x[j]) <= eps) continue;
++tot;
double k1 = x[i] * x[i],k2 = x[i],k3 = y[i],k4 = x[j] * x[j],k5 = x[j],k6 = y[j];
a[tot] = ((k6 * k2 - k3 * k5)) / ((k4 * k2 - k1 * k5));
b[tot] = (k3 - k1 * a[tot]) / k2;
if(a[tot] >= 0) --tot;
}
}
for(int i = 1;i <= tot;++i) {
sol[i] = (1 << n) - 1;
for(int j = 1;j <= n;++j)
if(calc(a[i],b[i],x[j],y[j])) sol[i] ^= (1 << (j - 1));
}
for(int i = 1;i <= n;++i) {
++tot;
sol[tot] = ((1 << n) - 1) ^ (1 << (i - 1));
}
printf("%d\n",dfs((1 << n) - 1));
}
return 0;
}
Noip2016Day2T3 愤怒的小鸟的更多相关文章
- NOIP2016Day2T3愤怒的小鸟(状压dp) O(2^n*n^2)再优化
看这范围都知道是状压吧... 题目大意就不说了嘿嘿嘿 网上流传的写法复杂度大都是O(2^n*n^2),这个复杂度虽然官方数据可以过,但是在洛谷上会TLE[百度搜出来前几个博客的代码交上去都TLE了], ...
- [NOIP2016]愤怒的小鸟 D2 T3 状压DP
[NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...
- 基于html5实现的愤怒的小鸟网页游戏
之前给大家分享一款基于html5 canvas和js实现的水果忍者网页版,今天给大家分享一款基于html5实现的愤怒的小鸟网页游戏.这款游戏适用浏览器:360.FireFox.Chrome.Safar ...
- [luogu2831][noip d2t3]愤怒的小鸟_状压dp
愤怒的小鸟 noip-d2t3 luogu-2831 题目大意:给你n个点,问最少需要多少条经过原点的抛物线将其覆盖. 注释:1<=点数<=18,1<=数据组数<=30.且规定 ...
- 洛谷P2831 愤怒的小鸟 + 篮球比赛1 2
这三道题一起做,有一点心得吧. 愤怒的小鸟,一眼看上去是爆搜,但是实现起来有困难(我打了0分出来). 还有一种解法是状压DP. 抛物线一共只有那么多条,我们枚举抛物线(枚举两个点),这样就能够预处理出 ...
- Unity3D笔记 愤怒的小鸟<二> 实现Play界面
创建Play界面.能个把各个图片组合成一个场景,场景组成后背景能够不停的滚动,当鼠标单击时显示图片手型鼠标 一.GUI Texture 1.创建背景.地面.树木.草 ,这里注意Z轴的排序,一层一层则第 ...
- Unity3D笔记 愤怒的小鸟<一>场景切换
新建3个场景,场景1 Start 十秒后自动切换到场景2 Splash,场景2在二秒后自动切换到场景3 Selection 一.场景一Start 二.场景2 Splash 三.场景3 Selectio ...
- Unity3D游戏-愤怒的小鸟游戏源码和教程(二)
Unity愤怒的小鸟游戏教程(二) 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) AngryEva游戏效果 ...
- Unity3D游戏-愤怒的小鸟游戏源码和教程(一)
Unity愤怒的小鸟游戏教程 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) AngryEva游戏效果: 1 ...
随机推荐
- Computer: CMD and use windows system to better
Xx_Introduction Please protection,respect,love,"China's Internet Security Act"! For learni ...
- 发送RCS 消息摘录相关成功log
//11-25 16:48:09.612102 2175 2726 I BugleDataModel: PendingMessagesProcessor: process from InsertN ...
- Andriod安卓下开发UHF读写器
随着在Andriod设备上使用UHF读写器变得越来越广泛,友我科技独立研发了UHF读写器的android开发包,使用此开发包,工程师只需在工程中导入jar包,使用java语言就可以轻松的开发出Andr ...
- 【Spring Cloud】Spring Cloud Config 实现分布式配置中心
Spring Cloud Config 实现分布式配置中心 一.分布式配置中心 分布式系统中,往往拥有大量的服务应用,而每个应用程序都需要有对应的配置文件来协助完成服务环境初始化.运行.因此生产了大量 ...
- ES6.x
类 class Animal{ constructor(name){ this.name=name } Spack(){ console.log(name) } } class Dog extends ...
- 外部调用Tomcat启动脚本后日志中文显示乱码问题的解决
外部sh脚本如下 #!/bin/bash while read LINE do echo "Hello $LINE!" case $LINE in all) tail -f -n2 ...
- R-5 相关分析-卡方分析
本节内容: 1:相关分析 2:卡方分析 一.相关分析 相关系数: 皮尔逊相关系数:一般用来计算两个连续型变量的相关系数. 肯德尔相关系数:一个连续一个分类(最好是定序变量) 斯皮尔曼相关系数:2个变量 ...
- kubernetes部署高可用redis
本文redis通过helm搭建,提供redis高可用完整的编排,关于Helm的搭建和使用请查看文章<helm的搭建及使用>,其中前一章介绍了Helm搭建,并提供了Helm搭建Harbor的 ...
- Slickflow.NET 开源工作流引擎高级开发(六) -- WebTest 引擎接口模拟测试工具集
前言:引擎组件的接口测试不光是程序测试人员使用,而且也是产品负责人员需要用到的功能,因为在每一步流转过程中,就会完整模拟实际用户发生的场景,也就容易排查具体是程序问题还是业务问题,从而快速定位问题,及 ...
- PlayJava Day017
今日所学: /* 2019.08.19开始学习,此为补档. */ 1.数组变量 a.数组变量是数组的管理者而非数组本身 b.数组必须创建出来然后交给数组变量来管理 c.数组变量之间的赋值是管理权限的赋 ...