洛谷P2831 愤怒的小鸟
洛谷P2831 愤怒的小鸟
原题链接
题解
首先简单数学公式送上。
\(ax_1^2+bx_1=y_1\)
\(ax_2^2+bx_2=y_2\)
\(ax_1^2x_2+bx_1x_2=y_1x_2\)
\(ax_2^2x_1+bx_2x_1=y_2x_1\)
\(a=(y_1x_2-y_2x_1)/x_1x_2(x_1-x_2)\)
\(b=(y_1-ax_1^2)/x_1\)
不用证明吧。。。
85分
状态压缩。每次枚举两个点计算抛物线,然后消除这条线上所有点,再转移。
// It is made by XZZ
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
#define rep(a,b,c) for(rg int a=b;a<=c;a++)
#define drep(a,b,c) for(rg int a=b;a>=c;a--)
#define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
#define il inline
#define rg register
#define vd void
typedef long long ll;
il int gi(){
rg int x=0,f=1;rg char ch=getchar();
while(ch<'0'||ch>'9')f=ch=='-'?-1:f,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
#define db double
db x[18],y[18],eps=0.00000001;
int f[1<<18],n;
il int dp(int v){
if(v==0)return 0;
if(v==(v&-v))return 1;
if(f[v])return f[v];
f[v]=233;
rep(i,0,n-1)if(v&(1<<i))rep(j,i+1,n-1)if((v&(1<<j))){
db a=(y[i]*x[j]-y[j]*x[i])/(x[i]*x[j]*(x[i]-x[j])),b=(y[i]-a*x[i]*x[i])/(x[i]);
if(a>=0)continue;
int V=v;
rep(k,0,n-1)if((V&(1<<k))&&fabs(a*x[k]*x[k]+b*x[k]-y[k])<=eps)V^=1<<k;
f[v]=min(f[v],dp(V)+1);
}
rep(i,0,n-1)if(v&(1<<i))f[v]=min(f[v],dp(v^(1<<i))+1);
return f[v];
}
il vd work(){
n=gi();gi();
rep(i,0,n-1)scanf("%lf%lf",&x[i],&y[i]);
rep(i,0,(1<<n)-1)f[i]=0;
printf("%d\n",dp((1<<n)-1));
}
int main(){
int T=gi();
while(T--)work();
return 0;
}
AC算法
上面理论复杂度\(O(2^nn^2T)\)。会炸。
思考原因。
显然算重情况较多。
再想想。。。每个状态的第一头猪最后肯定要被打死(废话)。强制它第一个死,只需枚举一个点
理论复杂度\(O(2^nnT)\)。
// It is made by XZZ
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
#define rep(a,b,c) for(rg int a=b;a<=c;a++)
#define drep(a,b,c) for(rg int a=b;a>=c;a--)
#define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
#define il inline
#define rg register
#define vd void
typedef long long ll;
il int gi(){
rg int x=0,f=1;rg char ch=getchar();
while(ch<'0'||ch>'9')f=ch=='-'?-1:f,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
#define db double
db x[18],y[18],eps=0.0000001;
int f[1<<18],n;
il int dp(int v){
if(v==0)return 0;
if(v==(v&-v))return 1;
if(f[v])return f[v];
f[v]=233;
int j=log2(v&-v);
rep(i,j+1,n-1)if(v&(1<<i)){
db a=(y[i]*x[j]-y[j]*x[i])/(x[i]*x[j]*(x[i]-x[j])),b=(y[i]-a*x[i]*x[i])/(x[i]);
if(a>=0)continue;
int V=v;
rep(k,j,n-1)if((V&(1<<k))&&fabs(a*x[k]*x[k]+b*x[k]-y[k])<=eps)V^=1<<k;
f[v]=min(f[v],dp(V)+1);
}
f[v]=min(f[v],dp(v-(v&-v))+1);
return f[v];
}
il vd work(){
n=gi();gi();
rep(i,0,n-1)scanf("%lf%lf",&x[i],&y[i]);
rep(i,0,(1<<n)-1)f[i]=0;
printf("%d\n",dp((1<<n)-1));
}
int main(){
int T=gi();
while(T--)work();
return 0;
}
洛谷P2831 愤怒的小鸟的更多相关文章
- 洛谷 P2831 愤怒的小鸟
P2831 愤怒的小鸟 题目描述 Kiana 最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于 (0,0)(0,0) 处,每次 Kiana 可以用它向第一象 ...
- 洛谷P2831 愤怒的小鸟 + 篮球比赛1 2
这三道题一起做,有一点心得吧. 愤怒的小鸟,一眼看上去是爆搜,但是实现起来有困难(我打了0分出来). 还有一种解法是状压DP. 抛物线一共只有那么多条,我们枚举抛物线(枚举两个点),这样就能够预处理出 ...
- 洛谷P2831 愤怒的小鸟——贪心?状压DP
题目:https://www.luogu.org/problemnew/show/P2831 一开始想 n^3 贪心来着: 先按 x 排个序,那么第一个不就一定要打了么? 在枚举后面某一个,和它形成一 ...
- 2018.11.02 洛谷P2831 愤怒的小鸟(状压dp)
传送门 状压一眼题. 直接f[i]f[i]f[i]表示未选择状态为iii时的最小次数. 然后考虑现在怎么转移. 显然可以直接枚举消掉某一个点或者某两个点,复杂度O(n22n)O(n^22^n)O(n2 ...
- 洛谷P2831 愤怒的小鸟(状压dp)
题意 题目链接 Sol 这题....我样例没过就A了??..算了,就当是样例卡精度吧.. 直接状压dp一下,\(f[sta]\)表示干掉\(sta\)这个集合里面的鸟的最小操作数 转移的时候判断一下一 ...
- 【洛谷P2831】[NOIP2016]愤怒的小鸟
愤怒的小鸟 题目链接 本来是刷状压DP的,然而不会.. 搜索是比较好想的,直接dfs就行了 我们可以知道两只猪确定一条抛物线 依次处理每一只猪,有以下几种方法: 1.先看已经建立的抛物线是否能打到这只 ...
- 洛谷 2831 (NOIp2016) 愤怒的小鸟——仅+1所以bfs优化
题目:https://www.luogu.org/problemnew/show/P2831 状压dp.跑得很慢.(n^2*2^n) 注意只打一只猪的情况. #include<iostream& ...
- 【noip】跟着洛谷刷noip题2
noip好难呀. 上一个感觉有点长了,重开一个. 36.Vigenère 密码 粘个Openjudge上的代码 #include<cstdio> #include<iostream& ...
- CodeForces 79D 【Password】,洛谷P3943 【星空】
其实我做的是洛谷的P3943,但是听说fstqwq窃题...... 题目描述: 小 C 拿来了一长串星型小灯泡,假装是星星,递给小 F,想让小 F 开心一点.不过,有 着强迫症的小 F 发现,这串一共 ...
随机推荐
- BZOJ3566:[SHOI2014]概率充电器(树形DP,概率期望)
Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器: “采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决定!SHOI 概率充电器, ...
- Kubernetes 学习2 k8s基础概念
一.架构描述 1.基本架构 2.pod ,有两类 a.自主式pod 自我管理的,创建之后,任然是需要提交给API Server,API Server接受之后然后由调度器调度到指定的 node节点,由n ...
- Ubuntu安装MySQL/MariaDB
安装MariaDB/MySQL MariaDB是MySQL的分支,与MySQL高度兼容,几乎所有的命令都一样.MariaDB是由前MySQL的开发人员离开Sun公司后开发的,目的是为了防止Oracle ...
- 《STL源码剖析》要点摘抄
1. STL的空间配置器 SGI STL设计了双层级配置器,第一级配置器直接使用malloc().free(),第二级配置器则视情况采用不同的策略:当配置区块超过128bytes时,视为“足够大”,便 ...
- 原生js创建模态框
1.效果图如下: 2.代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"& ...
- jquery toggleclass方法
给元素更改样式,一般使用 addClass() 和removeClass() jquery官方文档 对 addClass的介绍: Adds the specified class(es) to eac ...
- (转载)SendKeys.Send()的使用
SendKeys.Send() 使用SendKeys将键击和组合键击发送到活动应用程序.此类无法实例化.若要发送一个键击给某个类并立即继续程序流,请使用Send.若要等待键击启动的任何进程,请使用Se ...
- 如何发布自己模块到NPM
创建项目 npm init name: (my-npm) version: (1.0.0) description: 0.0.1 entry point: (index.js) test comman ...
- PHP中使用RabiitMQ---各项参数的使用方法
RabbitMQ在PHP使用,我在这里对RabbitMQ的各项方法和参数进行了一些梳理,有不足的地方还望各位大神指点. 想要使用rabbitMQ消息队列,首先需要安装 php_amqp.dll 扩展 ...
- C语言中const有什么用途
自己上网查的资料. 可以定义const常量,具有不可变性.例如:const int Max=100; Max++会产生错误; 便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患.例如: v ...