看了题解之后知道,是状压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 愤怒的小鸟的更多相关文章

  1. NOIP2016 DAY2 T3 愤怒的小鸟

    传送门 题目描述 Kiana 最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于 (0,0)(0,0) 处,每次 Kiana 可以用它向第一象限发射一只红色的 ...

  2. [NOIP2016]愤怒的小鸟 D2 T3 状压DP

    [NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...

  3. [NOIP2015]运输计划 D2 T3 LCA+二分答案+差分数组

    [NOIP2015]运输计划 D2 T3 Description 公元2044年,人类进入了宇宙纪元. L国有n个星球,还有n-1条双向航道,每条航道建立在两个星球之间,这n-1条航道连通了L国的所有 ...

  4. [NOIP2016]愤怒的小鸟 D2 T3

    Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可以用它向第一象限发射一只红色的小鸟,小鸟们的 ...

  5. 【NOIP2016提高组】 Day2 T3 愤怒的小鸟

    题目传送门:https://www.luogu.org/problemnew/show/P2831 说个题外话:NOIP2014也有一道题叫做愤怒的小鸟. 这题自测时算错了eps,导致被卡了精度,从1 ...

  6. 【NOIP 2016】Day2 T3 愤怒的小鸟

    Problem Description \(Kiana\) 最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于 \((0,0)\) 处,每次 \(Kiana\ ...

  7. [NOIP2016 TG D2T3]愤怒的小鸟

    题目大意:有一架弹弓位于(0,0)处,每次可以用它向第一象限发射一只小鸟,飞行轨迹均为形如y=ax2+bxy=ax+bx2 y=ax2+bx的曲线,且必须满足a<0(即是下开口的) 平面的第一象 ...

  8. [NOIp2016提高组]愤怒的小鸟

    题目大意: 平面直角坐标系的第一象限有n(n<=18)个点,你可以每次给出一个形如y=ax^2+bx的函数把经过这条函数的点消掉,问消掉所有的点至少要多少函数? 思路: 枚举每两个点对,可以唯一 ...

  9. NOIP2016 DAY1 T3 换教室

    换教室 Description 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节 课程安排在n个时间段上.在第i(1≤i≤n)个时间段上,两节内 ...

  10. 逛公园[NOIP2017 D2 T3](dp+spfa)

    题目描述 策策同学特别喜欢逛公园. 公园可以看成一张 \(N\)个点\(M\) 条边构成的有向图,且没有自环和重边.其中 1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值,代表策策经过这条 ...

随机推荐

  1. 牛客网练习赛7-D-无向图(bfs,链式前向星)

    题意:中文题: 思路:就是找某个点距离其他点的距离,他给你很多点也无所谓.用一个dist[]数组,这个数组保存的是他给你的点到其他点的最短距离且标记的作用,然后bfs搜索就行了. 代码: #inclu ...

  2. BZOJ4764弹飞大爷——LCT

    题目描述 自从WC退役以来,大爷是越来越懒惰了.为了帮助他活动筋骨,也是受到了弹飞绵羊一题的启发,机房的小伙伴们 决定齐心合力构造一个下面这样的序列.这个序列共有N项,每项都代表了一个小伙伴的力量值, ...

  3. BZOJ2631tree——LCT

    题目描述 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一:+ u v c:将u到v的路径上的点的权值都加上自然数c:- u1 v1 u2 v2:将树中原有的边( ...

  4. xml和对象 转换

    //测试数据 static List<User> list = new List<User>() { new User(){id=1001 ,name="语文&quo ...

  5. 说说Java 位运算

    前言 我们都知道,在计算机世界里,再复杂,再美的程序,到最后都会变成0与1.也就是我们常说的:二进制.二进制相信大家都很熟悉.与现实世界不同的是,在现实世界里,我们通常都是用十进制来表示的,也就是遇十 ...

  6. 批量导入导出站点权限site permissions

    批量导入站点权限   cls $Web = Get-SPWeb "http://16.178.115.14:91/" Get-Content c:\export\account.t ...

  7. for循环实例

    for循环“池理解”[root@localhost ~]# vi showday.sh#!/bin/bashfor TM in "Morning" "Noon" ...

  8. 本地Git与GitHub服务器建立连接(SSH方式通信)

    简介 Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. github是一个基于git的代码托管平台,付费用户可以建私人仓库,我们一般的免费用户只能使用公共仓库,也就是代码要 ...

  9. (转)Java程序员的面试经历和题库

    背景:最近我在找工作,前期就像打了鸡血的一样,隔一段时间没有面试,就又松懈了下来,看到别人写的面经,感觉就像打脸一般,以后要多多总结前人的经验,时刻保持压力状态才是. 作者:nuaazhaofeng2 ...

  10. NO.11 复制时勿忘其每个成分

    1.Coping 函数应该确保复制对象内的"每一个成员变量",和调用合适的 "base class"构造函数(base class 某些成员往往是private ...