NOIP2016 D2-T3 愤怒的小鸟
看了题解之后知道,是状压dp。
一、首先预处理一个$2^n$次方的fpow[]数组
- fpow[]=;
- for(Rint i=;i<=;i++)fpow[i]=(fpow[i-]<<);
二、然后预处理一个sta[i][j],表示经过O,i,j三点的那条抛物线经过的所有的点的状态,处理时要注意:
1、抛物线的$a$值大于等于0的要剔除
2、横坐标相同的两点不可能在同一条抛物线上
3、注意精度
处理完后就可以状压dp了。
三、dp时首先把dp[]值赋为inf
方程:
- chkmin(dp[i|sta[J][K]],dp[i]+)
四、最后的优化:
1、就是我们没有必要枚举所有的$i$,其实不论如何,在$dp[i]$中第一个没有出现的猪,我们最后一定要打的,所以我们干脆就只枚举最后那个猪,这样可以快一点
2、找到第一只没打过的猪后,只需要枚举从它开始剩下的猪即可,不要从1开始:
- for(Rint k=j+;k<=n;k++){//即此循环只需从j+1开始,而不需从1枚举到n
- int J=min(j,k),K=max(j,k);
- chkmin(dp[i|sta[J][K]],dp[i]+);
- }
五、Attention!(洛谷AC,UOJ WA)
假如得了97分的话,估计是精度问题
判断a的正负时要if(a<-1e-6)
判断是否是同一解要if(Abs(...)<=1e-12)
否则会炸extra test
六、最后上AC代码:
- #include<algorithm>
- #include<iostream>
- #include<cstdlib>
- #include<cstring>
- #include<cstdio>
- #include<cmath>
- #define Rint register int
- #define mem(a,b) memset(a,(b),sizeof(a))
- using namespace std;
- template<typename T>
- inline void read(T &x){
- x=;T w=,ch=getchar();
- while(!isdigit(ch)&&ch!='-')ch=getchar();
- if(ch=='-')w=-,ch=getchar();
- while(isdigit(ch))x=(x<<)+(x<<)+(ch^''),ch=getchar();
- x=x*w;
- }
- template<typename T>
- inline T Min(T &x,T &y){return x<y?x:y;}
- template<typename T>
- inline void chkmin(T &x,T y){if(y<x)x=y;}
- inline double Abs(double x){return x<?-x:x;}
- const int maxn=,inf=0x3f3f3f3f;
- const double eps=1e-,eeps=-1e-;
- int fpow[];
- int n,m,sta[maxn][maxn],dp[<<maxn];
- double x[maxn],y[maxn];
- inline void init(){
- n=;
- m=;
- }
- inline void update_sta(int a,int b){
- sta[a][b]=;
- double x1=x[a],y1=y[a],x2=x[b],y2=y[b];
- if(x1==x2)return;
- double A=(y1*x2-y2*x1)/(x1*x1*x2-x2*x2*x1);
- if(A>=eeps)return;
- double B=(y1-A*x1*x1)/x1;
- for(Rint i=;i<=n;i++)
- if(Abs(A*x[i]*x[i]+B*x[i]-y[i])<eps)
- sta[a][b]|=fpow[i-];
- }
- int main(){
- fpow[]=;
- for(Rint i=;i<=;i++)fpow[i]=(fpow[i-]<<);
- int TT;
- read(TT);
- while(TT--){
- init();
- read(n);read(m);
- for(Rint i=;i<=n;i++)scanf("%lf%lf",&x[i],&y[i]);
- for(Rint i=;i<=n;i++)
- for(Rint j=i+;j<=n;j++)
- update_sta(i,j);
- for(Rint i=;i<fpow[n];i++)dp[i]=inf;
- dp[]=;
- for(Rint i=;i<fpow[n];i++){
- if(dp[i]==inf)continue;
- for(Rint j=;j<=n;j++){
- if(!(i&fpow[j-])){
- for(Rint k=j+;k<=n;k++){
- int J=min(j,k),K=max(j,k);
- chkmin(dp[i|sta[J][K]],dp[i]+);
- }
- chkmin(dp[i|fpow[j-]],dp[i]+);
- break;
- }
- }
- }
- printf("%d\n",dp[fpow[n]-]);
- }
- return ;
- }
AC代码
NOIP2016 D2-T3 愤怒的小鸟的更多相关文章
- NOIP2016 DAY2 T3 愤怒的小鸟
传送门 题目描述 Kiana 最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于 (0,0)(0,0) 处,每次 Kiana 可以用它向第一象限发射一只红色的 ...
- [NOIP2016]愤怒的小鸟 D2 T3 状压DP
[NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...
- [NOIP2015]运输计划 D2 T3 LCA+二分答案+差分数组
[NOIP2015]运输计划 D2 T3 Description 公元2044年,人类进入了宇宙纪元. L国有n个星球,还有n-1条双向航道,每条航道建立在两个星球之间,这n-1条航道连通了L国的所有 ...
- [NOIP2016]愤怒的小鸟 D2 T3
Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可以用它向第一象限发射一只红色的小鸟,小鸟们的 ...
- 【NOIP2016提高组】 Day2 T3 愤怒的小鸟
题目传送门:https://www.luogu.org/problemnew/show/P2831 说个题外话:NOIP2014也有一道题叫做愤怒的小鸟. 这题自测时算错了eps,导致被卡了精度,从1 ...
- 【NOIP 2016】Day2 T3 愤怒的小鸟
Problem Description \(Kiana\) 最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于 \((0,0)\) 处,每次 \(Kiana\ ...
- [NOIP2016 TG D2T3]愤怒的小鸟
题目大意:有一架弹弓位于(0,0)处,每次可以用它向第一象限发射一只小鸟,飞行轨迹均为形如y=ax2+bxy=ax+bx2 y=ax2+bx的曲线,且必须满足a<0(即是下开口的) 平面的第一象 ...
- [NOIp2016提高组]愤怒的小鸟
题目大意: 平面直角坐标系的第一象限有n(n<=18)个点,你可以每次给出一个形如y=ax^2+bx的函数把经过这条函数的点消掉,问消掉所有的点至少要多少函数? 思路: 枚举每两个点对,可以唯一 ...
- NOIP2016 DAY1 T3 换教室
换教室 Description 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节 课程安排在n个时间段上.在第i(1≤i≤n)个时间段上,两节内 ...
- 逛公园[NOIP2017 D2 T3](dp+spfa)
题目描述 策策同学特别喜欢逛公园. 公园可以看成一张 \(N\)个点\(M\) 条边构成的有向图,且没有自环和重边.其中 1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值,代表策策经过这条 ...
随机推荐
- js 实现List
js 实现List 列表是一组有序的数据.每个列表中的数据项称为元素.在 JavaScript 中,列表中的元素可以是任意数据类型. 我们可以根据数组的特性来实现List. List 抽象数据类型定义 ...
- BZOJ4010[HNOI2015]菜肴制作——拓扑排序+堆
题目描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号为1.由于菜肴 ...
- BZOJ2595 WC2008游览计划(斯坦纳树)
斯坦纳树板子题. 考虑状压dp,设f[i][j][S]表示当前在点(i,j)考虑转移,其所在的联通块包含的关键点集(至少)为S的答案. 转移时首先枚举子集,有f[i][j][S]=min{f[i][j ...
- jdbc,mybatis,hibernate各自有优缺点以及区别
JDBC: 我们平时使用jdbc进行编程,大致需要下面几个步骤: 1,使用jdbc编程需要连接数据库,注册驱动和数据库信息 2,操作Connection,打开Statement对象 3,通过State ...
- Codeforces Round #337 (Div. 2) B. Vika and Squares
B. Vika and Squares time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- 【POI每日题解 #9】SKA-Piggy Banks
题目链接 题意: 有一棵环套树 求最少从多少个节点出发能沿边走过整棵树 环套树 并查集求联通块 有几块就砸几个 太简单不发代码了 不过某大佬的环套树找环dfs让我研究了好久… 贴一下以Orz #inc ...
- NOIp2017D2T2(luogu3959) 宝藏 (状压dp)
时隔多年终于把这道题锅过了 数据范围显然用搜索剪枝状压dp. 可以记还有哪些点没到(或者已到了哪些点).我们最深已到的是哪些点.这些点的深度是多少,然后一层一层地往下推. 但其实是没必要记最深的那一层 ...
- JNative 传递参数bug
下载JNative网址:http://sourceforge.net/projects/jnative/files/jnative/ 下载JNative版本:JNative_1.4RC3_bin.zi ...
- 跟我一起学习vue2(学习工程目录)[三]
查看生成的my-project的工程目录 首先看 build是最终发布的代码存放位置. 我查看了一下目录,里面都是Js文件 config目录里面主要是配置目录,包括端口号.如果开的项目多,可以进入in ...
- 蛋白质结构模型和功能预测:I-TASSER工具的使用
I-TASSER是一款用于预测蛋白质结构和功能的工具,网站链接:https://zhanglab.ccmb.med.umich.edu/I-TASSER/ 具体描述如下: I-TASSER (Iter ...