[noip2016]愤怒的小鸟<状压dp+暴搜>
题目链接:https://vijos.org/p/2008
现在回过头去看去年的考试题,发现都不是太难,至少每道题都有头绪了。。。
这道题的数据范围是18,这么小,直接暴力呗,跑个暴搜就完了,时间也就O(n^3)
【思路】
先枚举任意两个的抛物线,这个位置需要O(n^2),接着针对每一个抛物线看可以经过多少点,暴力跑一个,时间复杂度O(n^3),不过这一步可以在枚举抛物线时做。。
接着是用一个数组mark[i][j]记录经过点i,j的抛物线可以穿过哪些点。。这个位置,我们就可以用状态压缩解决,一个二进制,第i位为1表示可以穿过这个点,0则不行
然后就是f数组,f[i]的i状态下需要多少个鸟去打,i的二进制下表示当前有哪些点被穿过了,然后i的范围在二进制下就是0到11111111(n个1)
然后就是最后一个大循环,首先判断能不能达到状态i,如果可以就枚举第j的点,如果没有被穿过就是f[i|state[j]]=min(f[i|state[j]],f[i]+1)
(要么是原来的状态,要么从当前状态发射一只鸟)
接着就是枚举从j穿过的抛物线类型,f[i|mark[j][k]]=min(f[i|mark[j][k]],f[i]+1)
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#define maxn 30
#define LL long long
using namespace std; double x[maxn],y[maxn];
double ex=1e-;
int mark[maxn][maxn];
int f[(<<)+],state[maxn];
int n,m; void work(){
scanf("%d%d",&n,&m);
for(int i=;i<n;i++){
scanf("%lf%lf",&x[i],&y[i]);
}
memset(mark,,sizeof(mark));
for(int i=;i<n;i++){
for(int j=i+;j<n;j++){
double x1=x[i],x2=x[j],y1=y[i],y2=y[j];
double a=(x1*y2-y1*x2)/(x1*x2*x2-x1*x1*x2);
if(a>=)continue;//抛物线,开口向下
double b=(y1-a*x1*x1)/x1;
for(int k=;k < n;k++){
if(abs(y[k]-x[k]*x[k]*a-x[k]*b)<=ex){
//误差范围内,近似为0
//if(!(mark[i][j]&state[k]))mark[i][j]|=state[k];
mark[i][j]+=state[k];
}
}
}
}
memset(f,,sizeof(f));
int inf=f[];f[]=;
int lim=(<<n)-;//最终状态是11111111111 for(int i=;i<=lim;i++){//枚举每种状态
if(f[i]!=inf){
for(int j=;j<n;j++){
if(!(i&state[j])){//当前状态没有j
int now=i|state[j];
f[now]=min(f[i]+,f[now]);
//可以从f[i]再射出一只
for(int k=j+;k<n;k++){
int noww=i|mark[j][k];//j,k抛物线的所有猪
f[noww]=min(f[i]+,f[noww]);
}
}
}
} }
printf("%d\n",f[lim]);
} int main(){
int T;
scanf("%d",&T);
state[]=;
for(int i=;i<=;i++)
state[i]=state[i-]<<;
while(T--){
work();
}return ;
}
【总结】
当题中的问题状态可以转换成0,1表示的时候,可以考虑用状压dp,不过要正确使用二进制
[noip2016]愤怒的小鸟<状压dp+暴搜>的更多相关文章
- [NOIP2016]愤怒的小鸟 D2 T3 状压DP
[NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...
- 【洛谷P2831】[NOIP2016]愤怒的小鸟
愤怒的小鸟 题目链接 本来是刷状压DP的,然而不会.. 搜索是比较好想的,直接dfs就行了 我们可以知道两只猪确定一条抛物线 依次处理每一只猪,有以下几种方法: 1.先看已经建立的抛物线是否能打到这只 ...
- NOIP2016愤怒的小鸟 [状压dp]
愤怒的小鸟 题目描述 Kiana 最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于 (0,0) 处,每次 Kiana 可以用它向第一象限发射一只红色的小鸟, ...
- [NOIP2016]愤怒的小鸟
题目描述 Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可以用它向第一象限发射一只红色的小鸟,小鸟们的飞行轨迹均为形 ...
- Noip2016愤怒的小鸟(状压DP)
题目描述 题意大概就是坐标系上第一象限上有N只猪,每次可以构造一条经过原点且开口向下的抛物线,抛物线可能会经过某一或某些猪,求使所有猪被至少经过一次的抛物线最少数量. 原题中还有一个特殊指令M,对于正 ...
- [NOIP2016]愤怒的小鸟 D2 T3
Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可以用它向第一象限发射一只红色的小鸟,小鸟们的 ...
- luogu2831 [NOIp2016]愤怒的小鸟 (状压dp)
由范围可以想到状压dp 两个点(再加上原点)是可以确定一个抛物线的,除非它们解出来a>=0,在本题中是不合法的 这样的话,我们可以预处理出由任意两个点确定的抛物线所经过的所有的点(要特别规定一下 ...
- NOIP2016愤怒的小鸟 题解报告 【状压DP】
题目什么大家都清楚 题解 我们知道,三点确定一条抛物线,现在这条抛物线过原点,所以任意两只猪确定一条抛物线.通过运算的出对于两头猪(x1,y1),(x2,y2),他们所在抛物线a=(y1*x2-y2* ...
- [NOIP2016]愤怒的小鸟 状态压缩dp
题目描述 Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可以用它向第一象限发射一只红色的小鸟,小鸟们的飞行轨迹均为形 ...
- 洛谷 2831 (NOIp2016) 愤怒的小鸟——仅+1所以bfs优化
题目:https://www.luogu.org/problemnew/show/P2831 状压dp.跑得很慢.(n^2*2^n) 注意只打一只猪的情况. #include<iostream& ...
随机推荐
- markdown简明语法1
目录 Cmd Markdown 简明语法手册 1. 斜体和粗体 2. 分级标题 3. 外链接 4. 无序列表 5. 有序列表 6. 文字引用 7. 行内代码块 8. 代码块 9. 插入图像 Cmd M ...
- python如何用format进行进制转换与如何删除进制前缀
10进行十进制,十六进制,八进制,二进制的转换:(#:保留进制前缀)对于带着进制前缀的,如"0x"“0o”“0b”,可以直接在后面加上’x’‘o’'b’进行删除:其他的一些小技巧: ...
- Vue2.0 【第一季】第4节 v-text & v-html
目录 Vue2.0 [第一季]第4节 v-text & v-html 第四节 v-text & v-html Vue2.0 [第一季]第4节 v-text & v-html 第 ...
- 五分钟完成 ABP vNext 通讯录 App 开发
五分钟完成 ABP vNext 通讯录 App 开发 ABP vNext(后文简称Abp)是 Volo 公司堪称艺术品级的应用开发框架,它基于领域驱动设计(DDD)的思维,创新地采用了模块化的设计.A ...
- 033.Kubernetes集群安全-API Server认证及授权
一 Kubernetes集群安全 1.1 安全机制 Kubernetes通过一系列机制来实现集群的安全控制,其中包括API Server的认证授权.准入控制机制及保护敏感信息的Secret机制等.集群 ...
- js实践篇:例外处理Try{}catch(e){}
本文转载至:http://blog.csdn.net/ocean20/article/details/7301008 程序开发中,编程人员经常要面对的是如何编写代码来响应错误事件的发生,即例外处理(e ...
- 创建 VuePress + GithubPages + TravisCI 在线文档
目录 最终效果 思路 总体 过程 用到的东西 相关 创建Github仓库 创建Github仓库 SSH密钥链接Github 生成SSH密钥 Github添加SSH密钥 测试SSH密钥 配置VuePre ...
- 洛古 P1312 Mayan游戏(dfs+剪枝)
题目链接 这道题和俄罗斯方块很像 很明显,我们可以看出这是一个dfs,但是,我们需要几条剪枝: 1.如果只剩下1个或2个同样颜色的方块,那么直接退出 2.相同的块不用交换 3.注意优先性,优先左边换右 ...
- pycharm 更换pip镜像源为国内,解决下载慢的问题
参考链接:https://www.cnblogs.com/hkgov/p/7799078.html 官方源下载速度太慢,换成国内源会很快. 推荐清华的源:https://pypi.tuna.tsing ...
- 【转】Typora极简教程
Typora极简教程 Typora download ” Markdown 是一种轻量级标记语言,创始人是约翰·格鲁伯(John Gruber).它允许人们 “使用易读易写的纯文本格式编写文档,然后转 ...