首先每两个点可以确定一条抛物线,一条抛物线可能打掉很多猪。所以我们先O(n2)O(n^2)预处理一下第i个点和第j个点所确定的抛物线(算个公式就好了),如果a<0才合法,(注意精度问题,还有特判横坐标相等的,小心除0)然后对于这条抛物线,如果合法的话,我们O(n)O(n)扫一遍,看有没有其他的点也在这条抛物线上。用b数组记录一下(n<=18,我们显然可以用二进制压缩状态,共2n2^n种,把这条抛物线会打死的猪标为1,其他猪为0)。进行dp,我们对于每个状态st,找到第一头还活着的猪,记为i,反正i迟早得死,我们让它这一次死。枚举能打死他的抛物线,一波带走抛物线上所有点,接着dp。复杂度2n⋅n2^n·n
递归版更快,递推版更短小。

递归版

#include <bits/stdc++.h>
#define N 20
#define eps 1e-10
#define inf 0x3f3f3f3f
int tst,n,m,f[1<<20],b[N][N],ans=20;
inline int min(int x,int y){return x<y?x:y;}
inline double abs(double x){return x<0?-x:x;}
struct node{double x,y;
}a[N];
/*枚举s的子集(没有空集)for(int s1=s;s1>=1;s1=s&(s1-1){}*/
int dp(int st){if(f[st]!=inf) return f[st];if(st==0) return 0;//注意特判,不然会死。 int tot=0;for(int j=0;j<n;++j) if(st&(1<<j)) ++tot;int i=0;while(!(st&(1<<i))) ++i;if(tot==2){int j=i+1;while(!(st&(1<<j))) ++j;//注意!优先级高于一切。。。 if(b[i][j]) return 1;else return 2;}if(tot==1) return 1;for(int j=i;j<n;++j)if(b[i][j]) f[st]=min(f[st],dp(st&((1<<n)-1-b[i][j]))+1);return f[st];
}
int main(){
//  freopen("testdata.in","r",stdin);scanf("%d",&tst);while(tst--){scanf("%d%d",&n,&m);memset(b,0,sizeof(b));memset(f,0x3f,sizeof(f));for(int i=0;i<n;++i) b[i][i]=1<<i;for(int i=0;i<n;++i) scanf("%lf%lf",&a[i].x,&a[i].y);for(int i=0;i<n;++i)for(int j=i+1;j<n;++j){double aa=0,bb=0;if(abs(a[i].x-a[j].x)<eps) continue;aa=(a[i].y*a[j].x-a[i].x*a[j].y)/(a[i].x*a[j].x*(a[i].x-a[j].x));bb=a[i].y/a[i].x-aa*a[i].x;if(aa>-eps) continue;//注意精度eps相当于0 b[i][j]=(1<<i)+(1<<j);for(int k=j+1;k<n;++k)if(abs(a[k].x*a[k].x*aa+a[k].x*bb-a[k].y)<eps) b[i][j]+=(1<<k);}int ans=dp((1<<n)-1);printf("%d\n",ans);}return 0;
}

递推版

#include <bits/stdc++.h>
#define N 20
#define eps 1e-10
#define inf 0x3f3f3f3f
int tst,n,m,f[1<<20],b[N][N],bin[N];//b的1表示打出这条抛物线后还活着的猪
inline int min(int x,int y){return x<y?x:y;}
inline double abs(double x){return x<0?-x:x;}
struct node{double x,y;
}a[N];
int main(){
//  freopen("testdata.in","r",stdin);scanf("%d",&tst);bin[0]=1;for(int i=1;i<=18;++i) bin[i]=bin[i-1]<<1;while(tst--){scanf("%d%d",&n,&m);memset(b,0,sizeof(b));for(int i=0;i<n;++i) scanf("%lf%lf",&a[i].x,&a[i].y);for(int i=0;i<n;++i)for(int j=i+1;j<n;++j){double x1=a[i].x,x2=a[j].x,y1=a[i].y,y2=a[j].y;double A=0,B=0;b[i][j]=bin[n]-1;if(abs(x1-x2)<eps) continue;A=(y1*x2-x1*y2)/(x1*x2*(x1-x2));B=y1/x1-A*x1;if(A>-eps) continue; for(int k=0;k<n;++k)if(abs(a[k].x*a[k].x*A+a[k].x*B-a[k].y)<eps) b[i][j]-=bin[k];}f[0]=0;for(int i=1;i<=bin[n]-1;++i){int x=0;for(;;x++) if(i&bin[x]) break;f[i]=f[i-bin[x]]+1;//只打掉这头猪 for(int j=x+1;j<n;++j) f[i]=min(f[i],f[i&b[x][j]]+1);}printf("%d\n",f[bin[n]-1]);}return 0;
}

uoj265【2016提高】愤怒的小鸟(状压dp)相关推荐

  1. P2831 [NOIP2016 提高组] 愤怒的小鸟 状压dp

    某谷链接 题意:选最少的抛物线来覆盖所有点. 注意到a<0,所以我们可以枚举两个点来构成一条抛物线,让后记这两个点构成的抛物线为 cov[i][j]cov[i][j]cov[i][j],让后他存 ...

  2. [ NOIP提高组 2016]愤怒的小鸟(暴搜 + 状压DP)// [SNOI2017]一个简单的询问(莫队)

    一次性写两道题 T1:一个简单的询问 题目 题解 代码实现 T2:愤怒的小鸟 题目 暴搜题解 暴搜代码实现 状压DP题解 状压DP代码实现 T1:一个简单的询问 题目 给你一个长度为 N 的序列 ai ...

  3. 刷题周记(九)——#状压DP:最短Hamilton路径、小国王(互不侵犯)、玉米田(Corn Fields G)、愤怒的小鸟、吃奶酪、炮兵阵地、宝藏 #区间DP:清空字符串#DP:关灯问题II

    文章目录 --2020年12月20日(周日)------------------ 状压DP 一.最短Hamilton路径(模板题) 二.玉米田(P1879 [USACO06NOV]Corn Field ...

  4. [NOIP2016]愤怒的小鸟(状压DP)

    [NOIP2016]愤怒的小鸟(状压DP) 题目描述 输入输出格式 输入格式: 第一行包含一个正整数 T,表示游戏的关卡总数. 下面依次输入这 T个关卡的信息.每个关卡第一行包含两个非负整数 n,m, ...

  5. [蓝桥杯][算法提高VIP]Sharing Chocolate(状压dp记忆化搜索)

    题目描述 每天,巧克力在它的许多形式上被全世界数百万人分享.它是一个真正普遍的糖果,实际上在世界上每个国家都能得到. 你发现唯一比吃巧克力更好的事情是把它分享给朋友.不幸的是,你的朋友非常挑剔,有着不 ...

  6. 2021.8.11【提高B组模拟3】T1 积木(乱糊暴搜)(正解:状压dp)

    积木 题目大意 输入样例 3 8 7 6 3 9 4 1 10 5 输出样例 18 题目数据 解题思路 暴搜就没什么好讲的了 原本以为只有40,AC了就离谱 (数据真水) 正文:状压dp 前提:我这个 ...

  7. 状压dp个人刷题记录

    目录 一.普通型 蒙德里安的梦想 题意: 思路: code: #2153. 「SCOI2005」互不侵犯 题意: 思路: code: P1879 [USACO06NOV]Corn Fields G 题 ...

  8. POJ - 1185 炮兵阵地(状压dp)

    题目链接:点击查看 题目大意:中文题,题意很清晰,不多赘述 题目分析:最基础的状压dp,需要考虑如何转移,因为每一个炸弹所涉及的范围都是上下左右两个格子,我们可以从第一行开始向下转移,这样某一行的状态 ...

  9. 【牛客 - 301哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级)】小乐乐搭积木(状压dp)

    题干: 小乐乐想要给自己搭建一个积木城堡. 积木城堡我们假设为n*m的平面矩形. 小乐乐现在手里有1*2,2*1两种地砖. 小乐乐想知道自己有多少种组合方案. 输入描述: 第一行输入整数n,m.(1& ...

  10. CDOJ 1355 柱爷与三叉戟不得不说的故事(枚举子集状压dp)

    柱爷与三叉戟不得不说的故事 Time Limit: 500/500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Subm ...

最新文章

  1. 前列腺癌检测 AI 算法登上《柳叶刀》:分类性能超过人类专家,还能完成其他临床任务...
  2. 国有大型企业数据级同城异地灾难备份案例
  3. 公有云账单:忽略这四项成本,后果很严重!
  4. 认证方案之初步认识JWT
  5. Go 空结构体的 3 种使用场景
  6. 亿级流量峰值没在怕,“缓存”技术来减压
  7. 【转】局部变量和全局变量---------------【答不对,你还敢说你精通、熟悉python?】...
  8. FindFirstFile和FindNextFile
  9. html5 双水波加载动画,逼真的HTML5 3D水波动画 可多视角浏览
  10. B Start - 哔哩哔哩校招入职成长营
  11. 在线机械键盘测试软件,键盘检测软件(DAS G2 104/105 Keyboard Test Tool)
  12. ASP.NET程序设计复习题
  13. python快速接手别人的代码_Python 爬虫代码,网上找的别人的,但是报错,求高手指点...
  14. Navicat for mysql 在WIN10下导入SQL不成功解决办法
  15. OpenCPU入门基础
  16. CodeForces 74 C.Chessboard Billiard(并查集)
  17. 对极限编程四个核心的理解
  18. 35岁了 软件测试我还可以做多久,往后我怎么发展
  19. python图片压缩算法_使用K均值算法进行图片压缩
  20. 批量下载二维码并打成zip压缩包

热门文章

  1. 烧得七荤八素了,完了这下,本来现在应该在学校做网站的,然而半小时前还摊在床上哼哼唧唧。
  2. Datawhale二手车预测Task
  3. 计算机中毒症状简介,电脑中毒的八大表现,第五个大多数人都不知道!
  4. Ubuntu Linux上几款好玩的免费游戏
  5. 什么是 infiniband
  6. go文件上传断点续传功能
  7. 以后自己买了房子就用的上了
  8. 高桥盾react和boost_热门对比丨React pk Boost,你更偏向哪一双?
  9. python之python3.x版本用urllib爬虫出现的module 'urllib' has no attribute 'urlopen'与urllib.error.HTTPError: HTT
  10. 安装程序无法更新计算机配置,无法安装某些更新或程序