【NOIP2016提高组day2】愤怒的小鸟
分析
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)\)
对了,注意精度
#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const int maxlongint=2147483647;
const int mo=1000000007;
const int N=550005;
using namespace std;
int f[N],b[20][20],n,m,t,d[500],mi[N];
double a[N][2],a1,b1;
int min1(int x,int y)
{
return x>y?y:x;
}
int main()
{
freopen("angrybirds.in","r",stdin);
freopen("angrybirds.out","w",stdout);
mi[0]=1;
for(int i=1;i<=20;i++)
{
mi[i]=mi[i-1]*2;
}
scanf("%d",&t);
for(;t--;)
{
scanf("%d%d",&n,&m);
memset(b,0,sizeof(b));
memset(f,43,sizeof(f));
f[0]=0;
for(int i=1;i<=n;i++)
scanf("%lf%lf",&a[i][0],&a[i][1]);
for(int i=1;i<=n;i++)
{
b[i][i]=mi[i-1];
for(int j=1;j<=n;j++)
if(i!=j)
{
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];
a1=b1=0;
y*=xx1;
x*=xx1;
y1*=xx;
x1*=xx;
y-=y1;
x-=x1;
b1=y/x;
a1=(a[i][1]-a[i][0]*b1)/(a[i][0]*a[i][0]);
if(a1>=0) continue;
b[i][j]=mi[i-1]+mi[j-1];
for(int k=1;k<=n;k++)
if(k!=i && k!=j)
{
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)
{
b[i][j]+=mi[k-1];
}
}
}
}
d[0]=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
bool q=true;
if(f[b[i][j]]==1 || b[i][j]==0) continue;
for(int k=1;k<=n && q;k++)
for(int l=1;l<=n && q;l++)
if((b[i][j]&b[k][l])>=b[i][j] && b[i][j]!=b[k][l]) q=false;
if(q) d[++d[0]]=b[i][j],f[b[i][j]]=1;
}
for(int i=1;i<=d[0];i++)
for(int s=0;s<=mi[n]-1;s++)
{
f[s|d[i]]=min1(f[s|d[i]],f[s]+1);
}
printf("%d\n",f[mi[n]-1]);
}
}
【NOIP2016提高组day2】愤怒的小鸟的更多相关文章
- Noip2016 提高组 Day2 T1 组合数问题
题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...
- 【NOIP2016提高组day2】蚯蚓
那么我们开三个不上升队列, 第一个记录原来的蚯蚓, 第二个记录乘以p的蚯蚓 第三个记录乘以(1-p)的蚯蚓, 在记录每条就要入队列的时间,就可以求出增加的长度 每次比较三个队列的队首,取最大的值x的切 ...
- 【NOIP2016提高组】愤怒的小鸟
https://www.luogu.org/problem/show?pid=2831 BFS 看到N这么小就可以想到搜索,求最少步数显然应该用BFS. 在这题中过两猪可以唯一确定一条抛物线,每一步可 ...
- 【题解】NOIP2016提高组 复赛
[题解]NOIP2016提高组 复赛 传送门: 玩具谜题 \(\text{[P1563]}\) 天天爱跑步 \(\text{[P1600]}\) 换教室 \(\text{[P1850]}\) 组合数问 ...
- 【题解】NOIP2016 提高组 简要题解
[题解]NOIP2016 提高组 简要题解 玩具迷题(送分) 用异或实现 //@winlere #include<iostream> #include<cstdio> #inc ...
- NOIP2016提高组解题报告
NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合
- 18/9/16牛客网提高组Day2
牛客网提高组Day2 T1 方差 第一眼看就知道要打暴力啊,然而并没有想到去化简式子... 可能因为昨晚没睡好,今天上午困死 导致暴力打了一个半小时,还不对... #include <algor ...
- [日记&做题记录]-Noip2016提高组复赛 倒数十天
写这篇博客的时候有点激动 为了让自己不颓 还是写写日记 存存模板 Nov.8 2016 今天早上买了两个蛋挞 吃了一个 然后就做数论(前天晚上还是想放弃数论 但是昨天被数论虐了 woc noip模拟赛 ...
- 2013 Noip提高组 Day2
3288积木大赛 正文 题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前 ...
随机推荐
- 描述下什么是springcloud,springcloud中的组件有哪些?分别描述下它的原理?
1.什么是springcloud,springcloud中的组件有哪些? Spring cloud是一个基于Spring Boot实现的服务治理工具包,在微服务架构中用于管理和协调服务的微服务:就是把 ...
- [BeiJingWc2008]Gate Of Babylon
<基尔伽美修>是人类历史上第一部英雄史诗,两河流域最杰出的文学作品之一.作品讲述了基尔伽美修一生的传奇故事.在动画Fate/staynight中,基尔伽美修与亚瑟王等传说中的英雄人物一起出 ...
- Nginx配置反向代理与负载均衡
Nginx的upstream目前支持的分配算法: 1.round-robin 轮询1:1轮流处理请求(默认) 每个请求按时间顺序逐一分配到不同的应用服务器,如果应用服务器down掉,自动剔除,剩下的继 ...
- js多张图片合成一张图,canvas(海报图,将二维码和背景图合并) -----vue
思路:vue中图片合并 首先准备好要合并的背景图,和请求后得到的二维码, canvas画图,将两张背景图和一张二维码用canvas画出来, 将canvas再转为img 注意canvas和图片的清晰图和 ...
- 第七周&实验报告五
实验四 类的继承 •实验目的 •理解抽象类与接口的使用: •了解包的作用,掌握包的设计方法. •实验要求 •掌握使用抽象类的方法. •掌握使用系统接口的技术和创建自定义接口的方法. •了解 Java ...
- [Python3] 025 包
目录 1. 模块 1.1 模块是什么? 1.2 为什么用模块? 1.3 如何定义模块? 1.4 如何使用模块? 1.4.1 例子1 1.4.2 例子2 1.4.3 例子3 1.4.4 例子4 1.4. ...
- spring+redis实例(二)
这一篇redis实例是基于序列化储存-(写入对象,读取对象) 在spring+redis(一)中我们介绍了在spring中怎么去操作储存redis,基于string的储存,今天我们介绍一下redis基 ...
- <<C++ Primer>> 第三章 字符串, 向量和数组 术语表
术语表 第 3 章 字符串, 向量和数组 begin: 是 string 和 vector 的成员,返回指向第一个元素的迭代器.也是一个标准库函数,输入一个数字,返回指向该数字首元素的指针. 缓 ...
- 闭包、装饰器decorator、迭代器与生成器、面向过程编程、三元表达式、列表解析与生成器表达式
一.装饰器 一.装饰器的知识储备 不想修改函数的调用方式,但是还想在原来的函数前后添加功能 1.可变长参数 :*args和**kwargs def index(name,age): print(na ...
- 3.学习Dispatcher
3.学习Dispatcher 不管是WinForm应用程序还是WPF应用程序,实际上都是一个进程,一个进程可以包含多个线程,其中有一个是主线程,其余的是子线程. 在WPF或WinForm应用程序中,主 ...