分析

Kiana最近沉迷于一款神奇的游戏无法自拔。 简单来说,这款游戏是在一个平面上进行的。 有一架弹弓位于 (0, 0) 处,每次Kiana可以用它向第一象限发射一只红色的小鸟, 小鸟们的飞行轨迹均为形如 y = ax2 + bx 的曲线,其中 a, b 是Kiana指定的参数,且必须 满足 a < 0 。 当小鸟落回地面(即 x 轴)时,它就会瞬间消失。 在游戏的某个关卡里,平面的第一象限中有 n 只绿色的小猪,其中第 i 只小猪所在的坐标为 (xi, yi) 。 如果某只小鸟的飞行轨迹经过了 (xi, yi) ,那么第 i 只小猪就会被消灭掉,同时小鸟将会沿着原先的轨迹继续飞行; 如果一只小鸟的飞行轨迹没有经过 (xi, yi) ,那么这只小鸟飞行的全过程就不会对 第 i 只小猪产生任何影响。 例如,若两只小猪分别位于 (1, 3) 和 (3, 3) ,Kiana可以选择发射一只飞行轨迹为y = −x2 + 4x 的小鸟,这样两只小猪就会被这只小鸟一起消灭。 而这个游戏的目的,就是通过发射小鸟消灭所有的小猪。 这款神奇游戏的每个关卡对Kiana来说都很难,所以Kiana还输入了一些神秘的指令,使得自己能更轻松地完成这个游戏。 这些指令将在【输入格式】中详述。 假设这款游戏一共有 T 个关卡,现在Kiana想知道,对于每一个关卡,至少需要发射多少只小鸟才能消灭所有的小猪。 由于她不会算,所以希望由你告诉她。

分析

首先先求出每个点两两之间的函数解析式,并且求出这个解析式还能消灭那只猪。

状压背包,

设\(f_s\)表示状态为s的最小值(其中s为二进制数,表示每只猪有没有被消灭)

转移方程很简单\(f_{s|s`}=min(f_{s|s`},f_s+1)\)

时间复杂度\(O(2^n·n^2)\)

对了,注意精度

  1. #include <cmath>
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <cstring>
  6. #include <algorithm>
  7. #include <queue>
  8. const int maxlongint=2147483647;
  9. const int mo=1000000007;
  10. const int N=550005;
  11. using namespace std;
  12. int f[N],b[20][20],n,m,t,d[500],mi[N];
  13. double a[N][2],a1,b1;
  14. int min1(int x,int y)
  15. {
  16. return x>y?y:x;
  17. }
  18. int main()
  19. {
  20. freopen("angrybirds.in","r",stdin);
  21. freopen("angrybirds.out","w",stdout);
  22. mi[0]=1;
  23. for(int i=1;i<=20;i++)
  24. {
  25. mi[i]=mi[i-1]*2;
  26. }
  27. scanf("%d",&t);
  28. for(;t--;)
  29. {
  30. scanf("%d%d",&n,&m);
  31. memset(b,0,sizeof(b));
  32. memset(f,43,sizeof(f));
  33. f[0]=0;
  34. for(int i=1;i<=n;i++)
  35. scanf("%lf%lf",&a[i][0],&a[i][1]);
  36. for(int i=1;i<=n;i++)
  37. {
  38. b[i][i]=mi[i-1];
  39. for(int j=1;j<=n;j++)
  40. if(i!=j)
  41. {
  42. double y=a[i][1],y1=a[j][1],x=a[i][0],x1=a[j][0],xx=a[i][0]*a[i][0],xx1=a[j][0]*a[j][0];
  43. a1=b1=0;
  44. y*=xx1;
  45. x*=xx1;
  46. y1*=xx;
  47. x1*=xx;
  48. y-=y1;
  49. x-=x1;
  50. b1=y/x;
  51. a1=(a[i][1]-a[i][0]*b1)/(a[i][0]*a[i][0]);
  52. if(a1>=0) continue;
  53. b[i][j]=mi[i-1]+mi[j-1];
  54. for(int k=1;k<=n;k++)
  55. if(k!=i && k!=j)
  56. {
  57. if(a[k][1]-a[k][0]*a[k][0]*a1-a[k][0]*b1<=0.000000000001 && a[k][1]-a[k][0]*a[k][0]*a1-a[k][0]*b1>=-0.000000000001)
  58. {
  59. b[i][j]+=mi[k-1];
  60. }
  61. }
  62. }
  63. }
  64. d[0]=0;
  65. for(int i=1;i<=n;i++)
  66. for(int j=1;j<=n;j++)
  67. {
  68. bool q=true;
  69. if(f[b[i][j]]==1 || b[i][j]==0) continue;
  70. for(int k=1;k<=n && q;k++)
  71. for(int l=1;l<=n && q;l++)
  72. if((b[i][j]&b[k][l])>=b[i][j] && b[i][j]!=b[k][l]) q=false;
  73. if(q) d[++d[0]]=b[i][j],f[b[i][j]]=1;
  74. }
  75. for(int i=1;i<=d[0];i++)
  76. for(int s=0;s<=mi[n]-1;s++)
  77. {
  78. f[s|d[i]]=min1(f[s|d[i]],f[s]+1);
  79. }
  80. printf("%d\n",f[mi[n]-1]);
  81. }
  82. }

【NOIP2016提高组day2】愤怒的小鸟的更多相关文章

  1. Noip2016 提高组 Day2 T1 组合数问题

    题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...

  2. 【NOIP2016提高组day2】蚯蚓

    那么我们开三个不上升队列, 第一个记录原来的蚯蚓, 第二个记录乘以p的蚯蚓 第三个记录乘以(1-p)的蚯蚓, 在记录每条就要入队列的时间,就可以求出增加的长度 每次比较三个队列的队首,取最大的值x的切 ...

  3. 【NOIP2016提高组】愤怒的小鸟

    https://www.luogu.org/problem/show?pid=2831 BFS 看到N这么小就可以想到搜索,求最少步数显然应该用BFS. 在这题中过两猪可以唯一确定一条抛物线,每一步可 ...

  4. 【题解】NOIP2016提高组 复赛

    [题解]NOIP2016提高组 复赛 传送门: 玩具谜题 \(\text{[P1563]}\) 天天爱跑步 \(\text{[P1600]}\) 换教室 \(\text{[P1850]}\) 组合数问 ...

  5. 【题解】NOIP2016 提高组 简要题解

    [题解]NOIP2016 提高组 简要题解 玩具迷题(送分) 用异或实现 //@winlere #include<iostream> #include<cstdio> #inc ...

  6. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

  7. 18/9/16牛客网提高组Day2

    牛客网提高组Day2 T1 方差 第一眼看就知道要打暴力啊,然而并没有想到去化简式子... 可能因为昨晚没睡好,今天上午困死 导致暴力打了一个半小时,还不对... #include <algor ...

  8. [日记&做题记录]-Noip2016提高组复赛 倒数十天

    写这篇博客的时候有点激动 为了让自己不颓 还是写写日记 存存模板 Nov.8 2016 今天早上买了两个蛋挞 吃了一个 然后就做数论(前天晚上还是想放弃数论 但是昨天被数论虐了 woc noip模拟赛 ...

  9. 2013 Noip提高组 Day2

    3288积木大赛 正文 题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前 ...

随机推荐

  1. CentOS7上安装配置破解Elasticsearch+Kibana 6.4.2-6.5.1全过程

    最近正在学习服务器应用平台的搭建的相关知识.有幸从朋友与书上了解到Elastic套件的使用,我花了两天的时间把最新的套件部署在我的服务器上,中间踩了数不清的坑.我把整个过程都记录了下来与各位有需要的朋 ...

  2. python学习之内置函数(二)

    4.7.3 内置函数(2) int() str() bool() set() list():将一个可迭代对象转化为列表 tuple():将一个可迭代对象转换成元组 dic(): 通过相应的方式创建字典 ...

  3. 贪心+dp

    贪心+dp 好多题都是这个思想, 可以说是非常重要了 思想一: 在不确定序列无法dp的情况下, 我们不妨先假设序列已经选定, 而利用贪心使序列达到最优解, 从而先进行贪心排序, 在进行dp选出序列 思 ...

  4. POJ3585 Accumulation Degree【换根dp】

    题目传送门 题意 给出一棵树,树上的边都有容量,在树上任意选一个点作为根,使得往外流(到叶节点,叶节点可以接受无限多的流量)的流量最大. 分析 首先,还是从1号点工具人开始$dfs$,可以求出$dp[ ...

  5. lambda得用法

  6. Vue 子组件,向父组件传递。

  7. 为 JS 的字符串,添加一个 format 的功能。

    <script> String.prototype.format = function (kwargs) { var ret = this.replace(/\{(\w+)\}/g, fu ...

  8. SpringBoot_02通用mapper

    注意:一旦引入了通用Mapper的启动器,会覆盖Mybatis官方启动器的功能,因此需要移除对官方Mybatis启动器的依赖. 无需任何配置就可以使用了.如果有特殊需要,可以到通用mapper官网查看 ...

  9. 【6.10校内test】 noip模拟

    题目链接: p1  FBI树 p2  医院设置 p3  加分二叉树 | | | | | | 分 界 线 | | | | | | 应该算是一篇反思博. 对于OI,我真的算不上是热爱(当然不热爱不代表就不 ...

  10. 洛谷 P3368 树状数组 题解

    题面 本题随便看两眼就知道该题满足了优美的查分性质: 对于在区间[x,y]内操作时,应该将查分数组的第x项和第y+1项进行相反操作: 询问答案时,问第i个数的值就是查分数组的前i项和: 暴力+玄学卡常 ...