愤怒的小鸟

题目链接

本来是刷状压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. webservice 介绍

    Web service 即web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术即跨平台远程调用技术. l 采用标准SOAP(Simple Object Access Protocol)  协议 ...

  2. 牛客网Java刷题知识点之ArrayList 、LinkedList 、Vector 的底层实现和区别

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  3. opensuse13.2国内源和设置命令

    ustc-osshttp://mirrors.ustc.edu.cn/opensuse/distribution/13.2/repo/oss/ustc-non-osshttp://mirrors.us ...

  4. TOJ 1690 Cow Sorting (置换群)

    Description Farmer John's N (1 ≤ N ≤ 10,000) cows are lined up to be milked in the evening. Each cow ...

  5. jqGrid 将行的字变成超连接

    今天在项目中碰到要将jqGrid中的行做成超连接,请看代码步骤: name: , align: "left", formatter: function (cellValue, op ...

  6. bzoj 5298: [Cqoi2018]交错序列

    Description 我们称一个仅由0.1构成的序列为"交错序列",当且仅当序列中没有相邻的1(可以有相邻的0).例如,000,001 ,101,都是交错序列,而110则不是.对 ...

  7. 关于EF执行返回表的存储过程

    1.关于EF执行返回表的存储过程 不知道为什么EF生成的存储过程方法会报错,以下方法可以使用,call是MySQL执行存储过程的命令 [HttpGet] public HttpResponseMess ...

  8. 数据类型之Nullable

    Nullable 此结构在 .NET Framework 2.0 版中是新增的.

  9. Required Integer parameter 'XXX' is not present

    1.异常提示: DEBUG o.s.w.s.m.m.a.ServletInvocableHandlerMethod - Error resolving argument [2] [type=java. ...

  10. JavaScript入门几个概念

    JavaScript入门几个概念 刚刚入门JavaScript的时候,搞懂DOM.BOM以及它们的对象document和window很有必要. DOM是为了操作文档出现的API,document是它的 ...