题面

这种数据范围不是乱搞dfs就是乱搞状压DP

首先应该通过任一方式求出a和b的值;

任意一条抛物线只用两头猪就可以确定,所以我们N^2枚举,并把在这两头猪的抛物线上的猪都存进状态state[i][j];

然后枚举任意两个还没消灭的小猪i,j;f[i|state[j][k]]=min(f[i|state[j][k]],f[i]+1);

因为有些小猪只能单独被消灭,所以:f[i|(1<<j-1)]=min(f[i|(1<<j-1)],f[i]+1);

然后就好了:

#include <bits/stdc++.h>
#define eps 1e-7
#define inc(i,a,b) for(register int i=a;i<=b;i++)
using namespace std;
struct node{
double x;
double y;
}pig[20];
int f[1000010];
int bo[21];
int n,m;
int work(int pig1,int pig2)
{
if(pig[pig1].x==pig[pig2].x) return 0;
double x1=pig[pig1].x,x2=pig[pig2].x,y1=pig[pig1].y,y2=pig[pig2].y;
double tmpx=x1*x1*x2-x2*x2*x1,tmpy=y1*x2-y2*x1;
double a=tmpy/tmpx,b=(y1-a*x1*x1)/x1;
if(a>=0) return 0;
int res=0; bo[pig1]=bo[pig2]=1;
inc(i,1,n){
double x=pig[i].x,y=pig[i].y;
if(fabs(a*x*x+b*x-y)<eps) res|=1<<(i-1),f[1<<(i-1)]=f[res]=1;
}
return res;
}
int state[110][110];
int main()
{
int t;
cin>>t;
while(t--){
memset(f,0x3f,sizeof(f));
memset(state,0,sizeof(state));
memset(bo,0,sizeof(bo));
scanf("%d%d",&n,&m);
inc(i,1,n) scanf("%lf%lf",&pig[i].x,&pig[i].y),f[1<<i-1]=1;
inc(i,1,n) inc(j,1,i-1) state[i][j]=work(i,j);
inc(i,1,(1<<n)-1) inc(j,1,n){
if((i>>j-1)&1==1)continue;
inc(k,1,j-1){
if(i&(1<<k-1)==1) continue;
f[i|state[j][k]]=min(f[i|state[j][k]],f[i]+1);
}
f[i|(1<<j-1)]=min(f[i|(1<<j-1)],f[i]+1);
}
cout<<f[(1<<n)-1]<<endl;
}
}

NOIP2017 D2T3 题解的更多相关文章

  1. [luogu P3960] [noip2017 d2t3] 队列

    [luogu P3960] [noip2017 d2t3] 队列 题目描述 Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Syl ...

  2. NOIP2017 列队 题解报告【56行线段树】

    题目描述 Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n \times mn×m名学生,方阵的行数 ...

  3. NOIP2017总结 & 题解

    day1t1的结论貌似在哪见过,自己稍微验证了一下貌似没记错就没有管了.t2一道很好(keng)的模拟题啊t3自己做题好慢啊,想出来dp打上去最后几分钟才过了大样例,我写的是记忆化搜索,判-1很好判, ...

  4. NOIP2017 宝藏 题解报告【状压dp】

    题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中的宝藏.但是 ...

  5. 【学术篇】NOIP2017 d2t3 列队phalanx splay做法

    我可去他的吧.... ==============先胡扯些什么的分割线================== 一道NOIP题我调了一晚上...(其实是因为昨晚没有找到调试的好方法来的说...) 曾经我以 ...

  6. [NOIp2017]宝藏 题解

    非常巧妙的 \(O(n^23^n)\) 做法. 题目的本质是要求一棵生成树,使得其每条边的长度与这条边的起点深度乘积的和最小. 我们使用状压 DP,考虑到当前状态与已经打通的点和深度有关,不妨设 \( ...

  7. noip2017普及题解

    https://www.luogu.org/problemnew/show/3954 https://www.luogu.org/problemnew/show/3955 https://www.lu ...

  8. NOIP2017 D2T3列队

    这题我改了三天,考场上部分分暴力拿了50,考完试发现与正解很接近只是没写出来. 对于每一行和最后一列建n+1颗线段树,维护前缀和. 复杂度qlogn 假如你移动一个坐标为(x,y)的人,你要将第x行线 ...

  9. noip2017简要题解。

    重新写了一下去年的题来看看自己到底是有多傻逼. 小凯的疑惑 打表. 时间复杂度 搞了一大坨题面,但是真正有用的信息只有几个: 判断他给你的复杂度是多少. 判断当前循环进不进的去. 判断当前循环产生的贡 ...

随机推荐

  1. D. Make a Permutation!(思维)

    D. Make a Permutation! time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  2. Python之禅 this模块

    The Zen of Python, by Tim Peters Beautiful is better than ugly.Explicit is better than implicit.Simp ...

  3. Java线程中的异常处理

    对于对线程,当主线程中有子线程运行出现异常时,主线程是不能捕获到该异常的,子线程会直接退出,不会记录任何日志. 解决: 1.子线程中try catch. 2.设置线程的未捕获异常处理器,Uncaugh ...

  4. 10.矩形覆盖 Java

    题目描述 我们可以用2**1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个21的小矩形无重叠地覆盖一个2n的大矩形,总共有多少种方法? 思路 其实,倒数第一列要么就是1个2**1的矩形竖着放,要么就 ...

  5. 06.旋转数组的最小数字 Java

    题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋 ...

  6. python3笔记目录大纲汇总

    篇一.python3基础知识和语句 python3笔记一:python基础知识 python3笔记二:进制转换与原码反码补码 python3笔记三:运算符与表达式 python3笔记四:if语句 py ...

  7. Spring核心内容-认识bean

  8. TensorFlow 学习(5)——进一步了解MNIST

    接TensorFlow(3) 我们构建一个多层卷积网络,以提升MNIST的识别性能 权重初始化 为了创建这个模型,我们需要创建大量的权重和偏执项.这个模型中的权重在初始化是应该加入少量的噪声来打破对称 ...

  9. qt liunx 安装命令

    qt SDK : apt-get install qt-sdkqt 安装 : apt-get install qtcreator文档安装 : cmake kdelibs5-data subversio ...

  10. 解决 Elasticsearch 超过 10000 条无法查询的问题

    解决 Elasticsearch 超过 10000 条无法查询的问题 问题描述 分页查询场景,当查询记录数超过 10000 条时,会报错. 使用 Kibana 的 Dev Tools 工具查询 从第 ...