题目传送门:https://www.luogu.org/problemnew/show/P2831

说个题外话:NOIP2014也有一道题叫做愤怒的小鸟。

这题自测时算错了eps,导致被卡了精度,从100卡剩80

由于此题n的范围特别小,所以考虑使用状压dp。

我们用一个整数i来描述状态,i的第k个bit表示第k只鸟是否被消灭,f[i]表示在这一状态下所需鸟的最小数量。

由于不在同一直线上的三个点确定一条抛物线,所以我们可以预处理出所有的可行抛物线,并确定在该抛物线上的鸟的编号(这一步对精度要求极高)。同时考虑到两只鸟与原点存在三点共线的情况,故在抛物线方案中写入单独消灭指定一只小鸟的情况。故消灭方案之多有(n*(n-1)/2+n)种。

然后就愉快地进行转移啦~ 顺便吐槽下m没有卵用

时间复杂度为O(n^2*2^n)。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define M 18
#define eps (1e-10)
using namespace std;
int f[<<M]={};
int n;
struct pt{
int x,y; pt(){x=y=;}
pt(double xx,double yy){x=xx; y=yy;}
}a[M];
struct pao{
double a,b; pao(){a=b=;}
pao(pt A,pt B){
double x0=A.x,x1=B.x,y0=A.y,y1=B.y;
a=(y1-y0*x1/x0)/(x1*x1-x0*x1);
b=y0/x0-a*x0;
}
bool check(){
if(a>-eps) return ;
return ;
}
double get(double x){
double ans=a*x*x+b*x;
return ans;
}
};
int fly[M*M]={},use=;
bool b[<<M]={};
int Main(){
memset(f,,sizeof(f));
memset(a,,sizeof(a));
memset(fly,,sizeof(fly));
memset(b,,sizeof(b));
use=; int m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
double x,y; scanf("%lf%lf",&x,&y);
x=x*+0.3; y=y*+0.3;
a[i]=pt(x,y);
}
for(int i=;i<n;i++) fly[++use]=<<i;
for(int i=;i<=n;i++){
for(int j=;j<i;j++) if(i!=j){
if(a[i].x==a[j].x) continue;
pao A=pao(a[i],a[j]);
if(!A.check()) continue;
int x=;
for(int k=;k<n;k++){
double p=A.get(a[k+].x);
if(fabs(p-a[k+].y)<=eps)
x=x|(<<k);
}
if(!b[x])
fly[++use]=x,b[x]=;
}
}
int end=<<n; f[]=;
for(int i=;i<end;i++){
for(int j=;j<=use;j++)
f[i|fly[j]]=min(f[i|fly[j]],f[i]+);
}
printf("%d\n",f[end-]);
} int main(){
freopen("angrybirds.in","r",stdin);
freopen("angrybirds.out","w",stdout);
int cas; scanf("%d",&cas);
while(cas--) Main();
return ;
}

【NOIP2016提高组】 Day2 T3 愤怒的小鸟的更多相关文章

  1. 【NOIP2016提高组day2】愤怒的小鸟

    分析 Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于 (0, 0) 处,每次Kiana可以用它向第一象限发射一只红色的小鸟, 小鸟们的飞行轨迹均 ...

  2. Noip2016 提高组 Day2 T1 组合数问题

    题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...

  3. 【NOIP2016提高组day2】蚯蚓

    那么我们开三个不上升队列, 第一个记录原来的蚯蚓, 第二个记录乘以p的蚯蚓 第三个记录乘以(1-p)的蚯蚓, 在记录每条就要入队列的时间,就可以求出增加的长度 每次比较三个队列的队首,取最大的值x的切 ...

  4. NOIP2016提高组复赛C 愤怒的小鸟

    题目链接:http://uoj.ac/problem/265 题目大意: 太长了不想概括... 分析: 状压DP的模板题,把所有可能的抛物线用二进制表示,然后暴力枚举所有组合,详情见代码内注释 代码如 ...

  5. 一道搜索题【2013 noip提高组 DAY2 t3】华容道

    这篇不多说,具体的解释都在程序里 题目描述 [问题描述] 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果 ...

  6. 2012Noip提高组Day2 T3 疫情控制

    题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散到 ...

  7. 【题解】NOIP2016提高组 复赛

    [题解]NOIP2016提高组 复赛 传送门: 玩具谜题 \(\text{[P1563]}\) 天天爱跑步 \(\text{[P1600]}\) 换教室 \(\text{[P1850]}\) 组合数问 ...

  8. 18/9/16牛客网提高组Day2

    牛客网提高组Day2 T1 方差 第一眼看就知道要打暴力啊,然而并没有想到去化简式子... 可能因为昨晚没睡好,今天上午困死 导致暴力打了一个半小时,还不对... #include <algor ...

  9. 【题解】NOIP2016 提高组 简要题解

    [题解]NOIP2016 提高组 简要题解 玩具迷题(送分) 用异或实现 //@winlere #include<iostream> #include<cstdio> #inc ...

  10. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

随机推荐

  1. Unicode、UTF-8 和 ISO8859-1

    Unicode.UTF-8 和 ISO8859-1到底有什么区别 1.本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等. 在下面的描述中,将以"中文" ...

  2. 导出jar文件

    当我们编好一段代码时,就需要将其导出成应用程序,即jar文件(jar文件就是在Java运行环境下运行的应用程序).今天,巩固就教大家用eclipse导出jar文件. 第一步:找到eclipse,双击打 ...

  3. 对call() apply() 方法的简单理解

    真的是非常简单的理解,我知道的并不多,在网上查找了很多的资料,还是只能了解一点皮毛,下面来整理出来,方便以后深入的去学习,也是对目前知道的知识点的巩固. 整理一些网上的经典解答: 1.一句话区分cal ...

  4. 继承方法-->最终模式

    function inherit(Target,Origin){ function F(){}; F.prototype = Origin.prototype; // Targrt.prototype ...

  5. php PDO mysql

    php PDO写法连接mysql: $db=new PDO("mysql:host=localhost;dbname=sql","root","roo ...

  6. Hive 1.2.1&Spark&Sqoop安装指南

    目录 目录 1 1. 前言 1 2. 约定 2 3. 服务端口 2 4. 安装MySQL 2 4.1. 安装MySQL 2 4.2. 创建Hive元数据库 4 5. 安装步骤 5 5.1. 下载Hiv ...

  7. docker 命令介绍

    查看镜像 docker images: 列出imagesdocker images -a :列出所有的images(包含历史)docker images --tree :显示镜像的所有层(layer) ...

  8. Js中 关于top、clientTop、scrollTop、offsetTop

    网页可见区域宽: document.body.clientWidth; 网页可见区域高: document.body.clientHeight; 网页可见区域宽: document.body.offs ...

  9. Object-C 类和对象

    //创建对象             //类名 *对象名 = [[类名 alloc] init]   /*         Car *car = [[Car alloc] init];  //Car ...

  10. Javascript设计模式理论与实战:状态模式

    在软件开发中,很大部分时候就是操作数据,而不同数据下展示的结果我们将其抽象出来称为状态,我们平时开发时本质上就是对应用程序的各种状态进行切换并作出相应处理.状态模式就是一种适合多种状态场景下的设计模式 ...