洛谷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 发现,这串一共 ...
随机推荐
- Django的视图流式响应机制
Django的视图流式响应机制 Django的响应类型:一次性响应和流式响应. 一次性响应,顾名思义,将响应内容一次性反馈给用户.HttpResponse类及子类和JsonResponse类属于一次性 ...
- 随手练——HDU-2037 、P-2920 时间安排(贪心)
普通时间安排 HDU-2037 :http://acm.hdu.edu.cn/showproblem.php?pid=2037 选取结束时间早的策略. #include <iostream> ...
- [19/04/18-星期四] Java的动态性_动态编译(DynamicCompiler,Dynamic:动态的,Compiler:编译程序)
一.概念 应用场景:如在线评测系统,客户端编写代码,上传到服务器端编译运行:服务器动态加载某些类文件进行编译 /*** * */ package cn.sxt.jvm; import java.io. ...
- 【转】Java做服务器开发语言
版权声明:本文为博主原创文章,未经博主允许不得转载. 随着游戏市场的兴起,特别是网页游戏.手机游戏的崛起,对游戏开发技术的需求越来越多.网络游戏开发是一个庞大的体系,总体来说是客户端与服务器端.客户端 ...
- Dubbo实践(十七)telnet
telnet的介绍可以参看<java网络编程3>中有一段介绍telnet,我们可以理解为,telnet命令是通过socket协议与服务器端通信.Dubbo提供了telnet命令去查看服务功 ...
- linux性能指标及分析工具
一.CPU 1.良好状态指标 CPU利用率:User Time <= 70%,System Time <= 35%,User Time + System Time <= 70%. 上 ...
- HDU 3938 Portal (离线并查集,此题思路很强!!!,得到所谓的距离很巧妙)
Portal Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- 404 Note Found 队-Alpha1
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:丹丹 组员7:家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内 ...
- git did not exit cleanly (exit code 1)
git pull的时候报如下错误: error: Your local changes to the following files would be overwritten by merge: 文件 ...
- spring cloud gateway 之限流篇
转载请标明出处: https://www.fangzhipeng.com 本文出自方志朋的博客 在高并发的系统中,往往需要在系统中做限流,一方面是为了防止大量的请求使服务器过载,导致服务不可用,另一方 ...