愤怒的小鸟

题目链接

本来是刷状压DP的,然而不会。。

搜索是比较好想的,直接dfs就行了

我们可以知道两只猪确定一条抛物线

依次处理每一只猪,有以下几种方法:

1.先看已经建立的抛物线是否能打到这只猪

2.若1不可行,将这只猪与之前单着的猪配对,建抛物线

3.将这只猪单着,等待以后配对(若配不上,直接建一个只打一头猪的抛物线)

代码:

 #include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define N 20
#define eps 1e-6
#define INF 0x3f3f3f3f
#define fabs(x) ((x)>0?(x):-(x))
#define reset(a) memset(a,0,sizeof(a))
#define check(p,q,i) fabs(p*p*a[i]+p*b[i]-q)<=eps
int T,n,m,ans,cnt1,cnt2,dealta;
double X[N],Y[N],a[N],b[N];
double x[N],y[N];
bool used[N];
void dfs(int t){
if(cnt1+cnt2-dealta>=ans) return; //剪枝
if(t==n+){
ans=cnt1+cnt2-dealta;
return;
}
bool flag=;
for(int i=;i<=cnt1;i++)
if(check(X[t],Y[t],i)){ flag=;break; } //若以前建的抛物线能打到这头猪
if(flag){ dfs(t+); return; } //直接搜下一个
for(int i=;i<=cnt2;i++)
if(!used[i]){
if(fabs(X[t]-x[i])<=eps) continue;
double A=(X[t]*y[i]-x[i]*Y[t])/(X[t]*x[i]*x[i]-X[t]*X[t]*x[i]); //两猪确定一条抛物线
double B=(Y[t]-A*X[t]*X[t])/X[t];
if(A>=) continue; //抛物线开口不能朝上
used[i]=; dealta++; //used[i]置为1相当于第i个单着的猪删去,cnt2-dealta为单着的猪的总数
a[++cnt1]=A; b[cnt1]=B;
dfs(t+);
cnt1--; //回溯
used[i]=; dealta--;
}
x[++cnt2]=X[t]; y[cnt2]=Y[t];
dfs(t+);
cnt2--;
}
int main(){
scanf("%d",&T);
while(T--){
reset(X); reset(Y);
ans=INF; cnt1=cnt2=dealta=;
reset(x); reset(y); reset(used);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%lf%lf",&X[i],&Y[i]); //读入坐标
dfs(); printf("%d\n",ans);
}
return ;
}

【洛谷P2831】[NOIP2016]愤怒的小鸟的更多相关文章

  1. 洛谷 2831 (NOIp2016) 愤怒的小鸟——仅+1所以bfs优化

    题目:https://www.luogu.org/problemnew/show/P2831 状压dp.跑得很慢.(n^2*2^n) 注意只打一只猪的情况. #include<iostream& ...

  2. 洛谷P2831 愤怒的小鸟

    洛谷P2831 愤怒的小鸟 原题链接 题解 首先简单数学公式送上. \(ax_1^2+bx_1=y_1\) \(ax_2^2+bx_2=y_2\) \(ax_1^2x_2+bx_1x_2=y_1x_2 ...

  3. 洛谷 1600 (NOIp2016) 天天爱跑步——树上差分

    题目:https://www.luogu.org/problemnew/show/P1600 看TJ:https://blog.csdn.net/clove_unique/article/detail ...

  4. 洛谷 P2831 愤怒的小鸟

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

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

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

  6. 洛谷P2831 愤怒的小鸟——贪心?状压DP

    题目:https://www.luogu.org/problemnew/show/P2831 一开始想 n^3 贪心来着: 先按 x 排个序,那么第一个不就一定要打了么? 在枚举后面某一个,和它形成一 ...

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

    传送门 状压一眼题. 直接f[i]f[i]f[i]表示未选择状态为iii时的最小次数. 然后考虑现在怎么转移. 显然可以直接枚举消掉某一个点或者某两个点,复杂度O(n22n)O(n^22^n)O(n2 ...

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

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

  9. 洛谷 1850 NOIP2016提高组 换教室

    [题解] 先用floyed处理出两点间的最短路. 设f[i][j][k]表示走到第i个教室,总共换了j次,当前换或者不换,期望的最小移动距离. 分情况讨论来转移即可. #include<cstd ...

随机推荐

  1. Docker的学习笔记(开发的技术分享转发)

    我的Docker学习记录一.安装dockeryum install -y docker-io二.使用docker1.下载镜像docker pull <image>2.查询镜像docker ...

  2. 60分钟内从零起步驾驭Hive实战学习笔记(Ubuntu里安装mysql)

    本博文的主要内容是: 1. Hive本质解析 2. Hive安装实战 3. 使用Hive操作搜索引擎数据实战 SparkSQL前身是Shark,Shark强烈依赖于Hive.Spark原来没有做SQL ...

  3. 022-pinyin4j工具类模板

    模板一 package ${enclosing_package}; import java.util.Arrays; import net.sourceforge.pinyin4j.PinyinHel ...

  4. React.js 小书 Lesson11 - 配置组件的 props

    作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson11 转载请注明出处,保留原文链接和作者信息. 组件是相互独立.可复用的单元,一个组件可能在不 ...

  5. C语言中extern的用法--转

    http://blog.sina.com.cn/s/blog_52deb9d50100ml6y.html 在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的, ...

  6. ztree使用方法 python后台

    一.在提前加载js的地方写一段js,判断该页面是否需要添加ztree,我的项目所有提前加载的js都写在admin.js中 //增加ztree $(document).ready(function() ...

  7. flutter Failed to setup Skia Gr context导致白屏

    添加 --enable-software-rendering参数运行 G:\soft\flutter\project\hello_world> flutter run --enable-soft ...

  8. Android开发过程中部分报错解决方法。

    初学Android,最近在使用zxing开发一个条码扫描解析的安卓项目中,遇到以下几个问题.贴出来以供参考. 1.Http请求错误    Android4.0以上要求不能把网络请求的操作放在主线程里操 ...

  9. 05.File类的学习

    File  是文件的意思 File类是一个静态类,所以File类是一个工具类 File类是专门操作文件的类 File的常用方法 namespace _16.File类的学习 { class Progr ...

  10. Sass学习笔记(三)

    一.Sass的控制命令 二.Sass的函数功能 sass中除了可以定义变量,还自备了一系列函数功能,主要包括:字符串函数.数字函数.列表函数.颜色函数.Instrospection函数.三元函数等.当 ...