愤怒的小鸟

题目链接

本来是刷状压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. 简介SWT Jface

    可以使用标准窗口小部件工具箱(Standard Widget Toolkit,SWT)和 JFace 库来开发用于 Eclipse 环境的图形用户界面,而且还可以将它们用于开发单独的 GUI 本机应用 ...

  2. JVM 类加载全过程

    类加载机制 - JVM把class文件加载到内存中 并对数据进行 校验,解析,初始化,最终形成JVM可以直接使用的java类型的过程 详细过程  加载→ 验证→ 准备→ 解析 → 初始化→ 使用 → ...

  3. python制作 whl 源文件,并制作本地pip源

    制作whl 1.创建用于存放wheel文件目录 mkdir wheels 2.安装wheel库 pip install  wheel 3.进入wheels目录 cd wheels 4.使用pip wh ...

  4. 从零开始写C# MVC框架之--- 项目结构

    框架总分2个项目:Web开发项目.帮助类项目 (ZyCommon.Zy.Utilities) 1.ZyCommon,是Web开发项目结构.新建一个空解决方案,再建Data.Service.ZyWeb解 ...

  5. linq之Capacity(转载)

    出处:博客园 作者:mumuliang 连接:http://www.cnblogs.com/mumuliang/p/3914425.html Capacity 在.NET中List的容量应该只是受到硬 ...

  6. 从list中随机选出几个数,并按照原来的顺序排列

    需求: 从list中随机选出几个数,并按照原来的顺序排列(比如从list中随机选出6个数) 方案一: //若对象size大于6,则随机去除6个对象,并按照原来的顺序排列 while(list.size ...

  7. 在asp.net中如何使用Session

    2.那么在asp.net中到底该怎么使用Session呢? Session对象用于存储从一个用户开始访问某个特定的aspx的页面起,到用户离开为止,特定的用户会话所需要的信息.用户在应用程序的页面切换 ...

  8. Appium 如何模拟返回按键

    from appium.webdriver import Remote driver.keyevent(4) python中点击返回键是这样写的 附录 keycode 电话键 KEYCODE_CALL ...

  9. spring----spring中的注解@service等的作用

    service  是有用的相当于 xml配置中得bean  id = service  也可以不指定 不指定相当于 bean id =  com. service.service 就是这个类的全限定名 ...

  10. spring框架入门day01

    struts:web层,比较简单(ValueStack值栈,拦截器) hibernate:dao层,知识点杂 spring:service层,重要,讲多少用多少  --> [了解] spring ...