P2831 [NOIP2016 提高组] 愤怒的小鸟

news/2025/3/17 9:53:56/文章来源:https://www.cnblogs.com/rgw2010/p/18342379

思路:

考虑先求出经过 \((x_1,y_1),(x_2,y_2)\) 的抛物线解析式

我们有:

\[\begin{cases} ax_1^2 + bx_1 = y_1 \\ ax_2^2 + bx_2 = y_2\end{cases} \]

考虑将 \(b\) 消掉,求出 \(a\)

那么考虑令 \(1\) 式减去 \(2\) 式的 \(\frac{x_1}{x_2}\) 倍:

\[ax_1^2 + bx_1 - ax_1x_2 - bx_1 = y_1 - \frac{x_1}{x_2} y_2 \]

\[a(x_1^2 -x_1x_2) = y_1 - \frac{x_1}{x_2} y_2 \]

\[a = \frac{y_1 - \frac{x_1}{x_2} y_2}{x_1^2 -x_1x_2} = \frac{y_1x_2 - x_1 y_2}{x_1^2x_2 - x_1x_2^2} \]

因为 \(a\) 太复杂度,不好带入,考虑也将 \(a\) 消掉,求出 \(b\)

那么考虑令 \(1\) 式减去 \(2\) 式的 \(\frac{x_1^2}{x_2^2}\) 倍:

\[ax_1^2 + bx_1 - ax_1^2 - b\frac{x_1^2}{x_2} = y_1 - y_2 \frac{x_1^2}{x_2^2} \]

\[b(x_1 - \frac{x_1^2}{x_2}) = y_1 - y_2 \frac{x_1^2}{x_2^2} \]

\[b = \frac{y_1 - y_2 \frac{x_1^2}{x_2^2}}{x_1 - \frac{x_1^2}{x_2}} = \frac{y_1x_2^2 - y_2 x_1^2}{x_1x_2^2 - x_1^2 x_2} \]

那么我们可以得到经过 \((x_1,y_1),(x_2,y_2)\) 的抛物线解析式为:

\[y = \frac{y_1x_2 - x_1 y_2}{x_1^2x_2 - x_1x_2^2} x^2 + \frac{y_1x_2^2 - y_2 x_1^2}{x_1x_2^2 - x_1^2 x_2} x \]

可以通过这个解析式求出其它在这个抛物线上的点,设 \(A_{i,j}\) 表示经过点 \(i\) 和点 \(j\) 的抛物线经过的所有点的点集。

考虑状态压缩 dp,令 \(dp_S\) 表示 \(S\) 这个点集的鸟被射下来的最小次数,则:

\[dp_0 = 0 \]

\[dp_{S \operatorname{or} A_{i,j}} = \min(dp_{S \operatorname{or} A_{i,j}},dp_S + 1) \]

\[dp_{S \operatorname{or} 2^{i-1}} = \min(dp_{S \operatorname{or} 2^{i-1}},dp_S+1) \]

时间复杂度为 \(O(Tn^22^n)\)

完整代码:

#include<bits/stdc++.h>
#define Add(x,y) (x+y>=mod)?(x+y-mod):(x+y)
#define lowbit(x) x&(-x)
#define pi pair<ll,ll>
#define pii pair<ll,pair<ll,ll>>
#define iip pair<pair<ll,ll>,ll>
#define ppii pair<pair<ll,ll>,pair<ll,ll>>
#define fi first
#define se second
#define full(l,r,x) for(auto it=l;it!=r;it++) (*it)=x
#define Full(a) memset(a,0,sizeof(a))
#define open(s1,s2) freopen(s1,"r",stdin),freopen(s2,"w",stdout);
using namespace std;
typedef double db;
typedef unsigned long long ull;
typedef long long ll;
bool Begin;
const ll N=19,M=(1ll<<N)+10;
const db Eps=1e-6;
inline ll read(){ll x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}return x*f;
}
inline void write(ll x){if(x<0){putchar('-');x=-x;}if(x>9)write(x/10);putchar(x%10+'0');
}
ll T,n;
ll a[N][N];
ll dp[M];
db x[N],y[N];
pair<db,db> get(db x1,db y1,db x2,db y2){db a=(y1*x2-x1*y2)/(x1*x1*x2-x1*x2*x2);db b=(y1*x2*x2-y2*x1*x1)/(x1*x2*x2-x1*x1*x2);return {a,b};
}
db get(db x,db a,db b){return a*x*x+b*x;
}
void solve(){memset(dp,0x7f,sizeof(dp));n=read(),read();for(int i=1;i<=n;i++)scanf("%lf%lf",&x[i],&y[i]);for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){a[i][j]=0;auto t=get(x[i],y[i],x[j],y[j]);if(t.fi>=0)continue;for(int k=1;k<=n;k++){db h=get(x[k],t.fi,t.se);if(abs(h-y[k])<=Eps)a[i][j]|=(1ll<<(k-1));}}} dp[0]=0;for(int S=0;S<(1ll<<n);S++){for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){if((a[i][j]&S)==a[i][j])continue;dp[S|a[i][j]]=min(dp[S|a[i][j]],dp[S]+1);}}for(int i=1;i<=n;i++)dp[S|(1ll<<(i-1))]=min(dp[S|(1ll<<(i-1))],dp[S]+1);} write(dp[(1ll<<n)-1]);putchar('\n');
}
bool End;
int main(){T=read();while(T--)solve();cerr<<'\n'<<abs(&Begin-&End)/1048576<<"MB";return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/777952.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【EF Core】自动生成的字段值

自动生成字段值,咱们首先想到的是主键列(带 IDENTITY 的主键)。EF Core 默认的主键配置也是启用 Identity 自增长的,而且可以自动标识主键。前提是代表主键的实体属性名要符合以下规则: 1、名字叫 ID、id、或 Id,就是不分大小写; 2、名字由实体类名 + Id 构成。比如,Ca…

PowerBI_一分钟学会计算门店开业前3天销售金额_计算列及度量值方法

在某些特殊场景,我们往往需要去计算一些特定的组别的聚合数据 今天,就以计算门店开业前3天的销售情况,来学习一下,利用计算列和DAX度量值,两种快捷计算此类问题的方案。 一:XMIND二:示例数据 2.1 示例数据列说明为了方便验证和更清晰的检查结果,数据源只用了三列,分别…

雷达气象学(6)——径向速度图分析

目录6.1 速度场分析基础6.1.1 速度图分析的基本方法6.1.2 练习:整层为均匀西风6.1.3 练习:风向随高度顺转6.2 水平均匀风场的典型图像6.3 典型天气系统的判别6.3.1 锋面(切变线)系统6.3.1.1 冷锋(冷式切变线)6.3.1.2 暖锋(暖式切变线)6.3.2 逆风区6.3.3 中 \(\gamma\) …

wsl docker里运行ollama并使用nvidia gpu的一些记录

1、安装wsl2 具体过程网上一搜一把,这里就先略过了,只有wsl2能用哈 2、wsl里装docker,及相关配置 装dockerwget https://download.docker.com/linux/static/stable/aarch64/docker-23.0.6.tgz cd /mydata/tmp/ tar -zxvf docker-23.0.6.tgz mv docker/* /usr/bin/ mv dock…

程序员副业探索之电商

在腾讯广告工作期间,我主要负责小程序电商与广告业务,见证了互联网电商行业的剧变,特别是众多电商公司纷纷拥抱私域流量,直播带货成为新风尚,广告投入也在持续增加。通过这些经历,我积累了不少关于互联网电商的经验,并萌生了尝试电商副业的想法。 在小红书上,女装博主们…

mysql 为什么很多互联网公司选择了读可提交

前言 在默认环境下,mysql 是可重复读,为什么默认可重复读呢? 一般情况下感觉读可提交就行,可重复读解决幻读的问题,但是大多情况下没有幻读的问题,所以也没有必要可重复读。 那么为什么mysql 要把默认配置设置为可重复读呢? 正文 历史原因:这种图,如果是在可提交读的情…

day2-admin管理后台

admin管理后台 1.基于django初始化一个项目 1.conda activate 虚拟名字#进入虚拟环境 2.django-admin startproject blog#创建一个项目blog 3.cd blog #进入blog项目文件夹中 4.python manage.py startapp app的名字#创建一个app初始化数据库(django自带的sqlite)1.python ma…

1-初始前端基本标签

目录初始html –超文本标记语言1.超文本:2.标记语言:3.标签4.html基本框架5.拓展插件6.文字标签7.转义字符8.语义化与SEO 初始html –超文本标记语言 1.超文本:比普通的文本更厉害。可以插入图片/音乐/视频/超链接,对立面的内容进行排版,样式设计2.标记语言:可以吧html当做…

WIN10使用记录

一、win10任务栏任务缩略图变列表 运行中输入regedit,打开注册表编辑器。HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Taskband在右侧窗口中找到NumThumbnails,如果没有的话也要手工新建一个Dword(32位)值,把其命名为NumThumbnails, 双击NumT…

「Day 1—递归问题」

递归问题 定义 简洁来说就是一个函数不断调用自身的一个过程。 习题 汉诺塔问题 思路 对于这个经典的问题,我们考虑了使用递归的做法,由于盘子是在三个底座上来回辗转的,所以我们要确定起始座,辅助座,和目标座。我们专注于最下面的最大的那个盘子,先将盘子都放到辅助座上…

集合类关系

每天坚持,终会抵达!

人工智能的虚拟世界:源码和制作方法

源码和制作方法:人工智能的三维虚拟世界,完全免费、完全开源、完整无缺,一步步教你怎么制作这个游戏。8月4日修复学校场景输入框无法输入的故障,并增加教室外的楼道场景。 源码和制作方法:人工智能的三维虚拟世界,完全免费、完全开源、完整无缺,一步步教你怎么制作这个游…