【洛谷P2831】[NOIP2016]愤怒的小鸟
愤怒的小鸟
本来是刷状压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]愤怒的小鸟的更多相关文章
- 洛谷 2831 (NOIp2016) 愤怒的小鸟——仅+1所以bfs优化
题目:https://www.luogu.org/problemnew/show/P2831 状压dp.跑得很慢.(n^2*2^n) 注意只打一只猪的情况. #include<iostream& ...
- 洛谷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 ...
- 洛谷 1600 (NOIp2016) 天天爱跑步——树上差分
题目:https://www.luogu.org/problemnew/show/P1600 看TJ:https://blog.csdn.net/clove_unique/article/detail ...
- 洛谷 P2831 愤怒的小鸟
P2831 愤怒的小鸟 题目描述 Kiana 最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于 (0,0)(0,0) 处,每次 Kiana 可以用它向第一象 ...
- 洛谷P2831 愤怒的小鸟 + 篮球比赛1 2
这三道题一起做,有一点心得吧. 愤怒的小鸟,一眼看上去是爆搜,但是实现起来有困难(我打了0分出来). 还有一种解法是状压DP. 抛物线一共只有那么多条,我们枚举抛物线(枚举两个点),这样就能够预处理出 ...
- 洛谷P2831 愤怒的小鸟——贪心?状压DP
题目:https://www.luogu.org/problemnew/show/P2831 一开始想 n^3 贪心来着: 先按 x 排个序,那么第一个不就一定要打了么? 在枚举后面某一个,和它形成一 ...
- 2018.11.02 洛谷P2831 愤怒的小鸟(状压dp)
传送门 状压一眼题. 直接f[i]f[i]f[i]表示未选择状态为iii时的最小次数. 然后考虑现在怎么转移. 显然可以直接枚举消掉某一个点或者某两个点,复杂度O(n22n)O(n^22^n)O(n2 ...
- 洛谷P2831 愤怒的小鸟(状压dp)
题意 题目链接 Sol 这题....我样例没过就A了??..算了,就当是样例卡精度吧.. 直接状压dp一下,\(f[sta]\)表示干掉\(sta\)这个集合里面的鸟的最小操作数 转移的时候判断一下一 ...
- 洛谷 1850 NOIP2016提高组 换教室
[题解] 先用floyed处理出两点间的最短路. 设f[i][j][k]表示走到第i个教室,总共换了j次,当前换或者不换,期望的最小移动距离. 分情况讨论来转移即可. #include<cstd ...
随机推荐
- Apache Beam的基本概念
不多说,直接上干货! Apache Beam的基本概念 在使用Apache Beam构建数据处理程序,首先需要使用Beam SDK中的类创建一个Driver程序,在Driver程序中创建一个满足我们数 ...
- storm中KafkaSpout的选择
Storm最常用的消息源就是Kafka,在对接的时候大多需要使用KafkaSpout: 在网上大概有两种KafkaSpout,一种是只有几十行,一种却有一大啪啦类文件. 在kafka中,同一个part ...
- JDK7之HashMap源码
并发场景下使用HashMap的问题分析:疫苗:Java HashMap的死循环 http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6423457 ...
- 【Shell】运行shell出现-ash: ./test.sh: not found
1.这是一个读取文件的脚本 #!/bin/bash for line in `cat pidtestconf` do echo $line done 因为命名的时候这边使用的是 test.sh 这边将 ...
- 删除.browserslistrc文件就好了
$ npm run dev > bootstrap-vue@1.0.0 dev E:\aawork\1work\2019.2\bootstrap-vue> webpack-dev-serv ...
- 2017年11月3日 VS三大类&数组&VS的冒泡排序&集合&泛型集合
三大类 共分为两个大类: 基本数据型&引用类型 基本数据型---值类型---整型---常用的整型: Int , 长整型: Long, 小整型: byle, 中整型 short --浮点型 - ...
- 将金额数字转换为大写汉字的js函数
//将金额数字转换为大写汉字的函数 function convertCurrency(money) { //汉字的数字 var cnNums = new Array('零', '壹', '贰', '叁 ...
- HashMap和Hashtable存放null
Hashmap是可以放key为null的,Hashtable不能放key为null.hashtable放key为null会报空指针异常 1. hashmap put方法源码 public V put( ...
- sass的安装
sass的安装 1.当ruby安装完成后,在自己电脑开始菜单下面找到ruby的控制台"cmd"; 2.然后直接在命令行中输入 gem install sass 3.在安装过程中 可 ...
- sort属性
学习文章---链接 总结笔记 ①sort是Array.prototype的属性, ②如果不写入参数,则按照转换为的字符串的每个字符的unicode位点进行排序, ③如果传入一个比较函数sort(fun ...