题目

传送们P2831

题目较长,不加以赘述

直接步入正题

首先是数学知识,我们可以先根据给出的任意两只猪构建相应的抛物线,同时再构建完之后应判断抛物线的合法性(比如a小于0啊,等等),公式推演就不在这里说了,这里需要注意的是对于浮点型判断,不能单纯用相等,这里我们可以定义一个十分小的数,将两数差值与其相比,一般用到数为\(1e-6\)就可了,根据两个两只猪得来的抛物线,将其他猪带入,求相应抛物线所能经过的所有猪的状态,与原状态求或,即\(num[i][j]|=(1<<(k-1))\),就是\(k\)在\(i\),\(j\)所在抛物线上时更新该抛物线状态;

处理完这个,我们可以来定义DP数组了,对于这道题,我们只需要一维数组就可了,定义\(F[i]\)数组代表打死\(i\)状态下猪的所需最少小鸟数,首先枚举状态,其次枚举两层猪的个数(用于枚举抛物线),为了避免重复,第二遍枚举我们从第一遍所在位置开始枚举,在这里我们可以稍稍进行一下优化,在进行第一遍枚举时,如果这只猪已经包含在当前状态内,我们可以直接跳过,因为当我们跳过后,第二遍枚举有两种情况,即第一种,第二遍枚举的猪也包含在当前状态下,这时候可以直接跳过,第二种,所枚举的猪并不在当前状态下,需要进行操作,但是第一层循环会重复操作,故在进行第一遍枚举时,如果这只猪已经包含在当前状态内,我们可以直接跳过,来进行一个优化;

然后是转移方程,分为两种情况

  1. \(i\)和\(j\)相等时,那么我们有\(f[i|(1<<(j-1))]=min(f[i|(1<<(j-1))],f[i]+1)\),这种情况下\(F[i][(1<<(j-1))]\)只需要转移上一状态,或者在当前状态下多射出一直小鸟;
  2. \(i\)和\(j\)不相等时,\(f[i|num[j][k]]=min(f[i|num[j][k]],f[i]+1)\),解释同上;

还有一点,

因为本道题是多组测试数据,记得初始化

接下来是代码

#include<bits/stdc++.h>
using namespace std;
int T,n,m,num[20][20],f[1000000];
double x[20],y[20];
bool same(double x,double y){return fabs(x-y)<1e-6;}//判断相等与否的函数
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%lf%lf",&x[i],&y[i]);
memset(num,0,sizeof(num));//num数组初始化
for(int i=1;i<=n;i++){//第一遍枚举猪
for(int j=i+1;j<=n;j++){//第二遍枚举猪
if(same(x[i],x[j]))continue;//x[i]=x[j]无法构成抛物线
double a=(y[j]/x[j]-y[i]/x[i])/(x[j]-x[i]);//公式推导
if(a>0)continue;//a>0不合法抛物线,跳过
double b=y[i]/x[i]-a*x[i];//公式推导
for(int k=1;k<=n;k++){//枚举猪,判断其他猪是不是可以在该抛物线上
if(same(a*x[k]+b,y[k]/x[k]))num[i][j]|=(1<<(k-1));//如果可以,更新
}
}
}
memset(f,0x3f3f3f3f,sizeof(f));//初始化f数组
f[0]=0;//打死0这个状态下的猪需要小鸟0只
for(int i=0;i<=(1<<n)-1;i++){//枚举状态
for(int j=1;j<=n;j++){//第一层枚举猪
if(!(i&(1<<(j-1)))){//优化(具体见上)
for(int k=j;k<=n;k++){//第二层枚举猪
if(j==k)f[i|(1<<(j-1))]=min(f[i|(1<<(j-1))],f[i]+1);//j=k的转移情况
f[i|num[j][k]]=min(f[i|num[j][k]],f[i]+1);//j!=k的转移情况
} }
}
}
printf("%d\n",f[(1<<n)-1]);//输出打死(1<<n)-1(即所有猪)状态下猪所需要的小鸟数
}
}

状压DP之愤怒的小鸟的更多相关文章

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

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

  2. NOIP2016愤怒的小鸟 [状压dp]

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

  3. [Luogu P2831] 愤怒的小鸟 (状压DP)

    题面: 传送门:https://www.luogu.org/problemnew/show/P2831 Solution 首先,我们可以先康一康题目的数据范围:n<=18,应该是状压或者是搜索. ...

  4. Noip2016愤怒的小鸟(状压DP)

    题目描述 题意大概就是坐标系上第一象限上有N只猪,每次可以构造一条经过原点且开口向下的抛物线,抛物线可能会经过某一或某些猪,求使所有猪被至少经过一次的抛物线最少数量. 原题中还有一个特殊指令M,对于正 ...

  5. luogu2831 [NOIp2016]愤怒的小鸟 (状压dp)

    由范围可以想到状压dp 两个点(再加上原点)是可以确定一个抛物线的,除非它们解出来a>=0,在本题中是不合法的 这样的话,我们可以预处理出由任意两个点确定的抛物线所经过的所有的点(要特别规定一下 ...

  6. NOIP2016愤怒的小鸟 题解报告 【状压DP】

    题目什么大家都清楚 题解 我们知道,三点确定一条抛物线,现在这条抛物线过原点,所以任意两只猪确定一条抛物线.通过运算的出对于两头猪(x1,y1),(x2,y2),他们所在抛物线a=(y1*x2-y2* ...

  7. 洛谷P2831 愤怒的小鸟(状压dp)

    题意 题目链接 Sol 这题....我样例没过就A了??..算了,就当是样例卡精度吧.. 直接状压dp一下,\(f[sta]\)表示干掉\(sta\)这个集合里面的鸟的最小操作数 转移的时候判断一下一 ...

  8. [Noip2016]愤怒的小鸟(状压DP)

    题目描述 题意大概就是坐标系上第一象限上有N只猪,每次可以构造一条经过原点且开口向下的抛物线,抛物线可能会经过某一或某些猪,求使所有猪被至少经过一次的抛物线最少数量. 原题中还有一个特殊指令M,对于正 ...

  9. 【NOIP2016】愤怒的小鸟(状压DP)

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

随机推荐

  1. python IDE pycharm的安装与使用

    Python开发最牛逼的IDE——pycharm (其实其它的工具,例如eclipse也可以写,只不过比较麻烦,需要安装很多的插件,所以说pycharm是最牛逼的) pycharm,下载专业版的,不要 ...

  2. Flask 项目目录蓝图

    Flask 项目目录蓝图 小型项目 大型项目 定义蓝图 注册蓝图 template_folder="XXX" 参数是指 模板文件夹 注意 优先是找templates 在找自己指定的 ...

  3. 【Navicat】Navicat for MongoDBv15.0.6破解版(附破解教程)

    安装包下载链接:https://download.csdn.net/download/l1028386804/12519681 Navicat for MongoDB 15是一款功能十分强大的数据库管 ...

  4. RocketMQ系列(六)批量发送与过滤

    今天我们再来看看RocketMQ的另外两个小功能,消息的批量发送和过滤.这两个小功能提升了我们使用RocketMQ的效率. 批量发送 以前我们发送消息的时候,都是一个一个的发送,这样效率比较低下.能不 ...

  5. PAI-AutoLearning 图像分类使用教程

    概述 PAI AutoLearning(简称PAI AL)自动学习支持在线标注.自动模型训练.超参优化以及模型评估.在平台上只需准备少量标注数据,设置训练时长即可得到深度优化的模型.同时自动学习PAI ...

  6. 2019-02-01 Python爬虫爬取豆瓣Top250

    这几天学了一点爬虫后写了个爬取电影top250的代码,分别用requests库和urllib库,想看看自己能不能搞出个啥东西,虽然很简单但还是小开心. import requests import r ...

  7. excel 如何制作带下拉框的动态折线图表

    首先我们需要有个类似下图产品销量的基础数据表. 首先将光标放入表格中任意位置,然后插入一个不带点标记的折线图,然后将折线的颜色设置为灰色. 第一次设置成灰色后,一定善用f4快捷键进行快速的折线颜色设置 ...

  8. Excel经典教程之一

    照片名称:未命名 照片名称:自动筛选 照片名称:在Excel中字符替换 照片名称:在Excel中直接编辑“宏” 照片名称:在Excel中为导入外部数据 照片名称:在Excel中行列快速转换 照片名称: ...

  9. cb15a_c++_vector容器的自增长_每次增加百分之50

    cb15a_c++_vector容器的自增长_每次增加百分之50每次自动容量代销扩充,增加百分之50_for windows C++,vector是用数组做出来的->数组的缺点和优点优点:具有下 ...

  10. ca33a_demo_c++_新旧代码的兼容char数组与vector_string相互转换

    /*ca33a_demo_c++33_CppPrimer_新旧代码的兼容_txwtech旧代码:数组和c风格字符串新代码:vector和string相互转换:c风格字符串<- ->stri ...