[ABC274E] Booster
Problem Statement
In a two-dimensional plane, there are $N$ towns and $M$ chests. Town $i$ is at the coordinates $(X_i,Y_i)$, and chest $i$ is at the coordinates $(P_i,Q_i)$.
Takahashi will go on a trip where he starts at the origin, visits all $N$ towns, and then returns to the origin.
It is not mandatory to visit chests, but each chest contains an accelerator. Each time he picks up an accelerator, his moving speed gets multiplied by $2$.
Takahashi's initial moving speed is $1$. Find the shortest time needed to complete the trip.
Constraints
- $1 \leq N \leq 12$
- $0 \leq M \leq 5$
- $-10^9 \leq X_i,Y_i,P_i,Q_i \leq 10^9$
- $(0,0)$, $(X_i,Y_i)$, and $(P_i,Q_i)$ are distinct.
- All values in the input are integers.
Input
The input is given from Standard Input in the following format:
$N$ $M$
$X_1$ $Y_1$
$\vdots$
$X_N$ $Y_N$
$P_1$ $Q_1$
$\vdots$
$P_M$ $Q_M$
Output
Print the answer. Your output will be considered correct if the absolute or relative error from the judge's answer is at most $10^{-6}$.
Sample Input 1
2 1
1 1
0 1
1 0
Sample Output 1
2.5000000000
Here is one optimal way to complete the trip.
- Go the distance $1$ from the origin to chest $1$ at a speed of $1$, taking a time of $1$.
- Go the distance $1$ from chest $1$ to town $1$ at a speed of $2$, taking a time of $0.5$.
- Go the distance $1$ from town $1$ to town $2$ at a speed of $2$, taking a time of $0.5$.
- Go the distance $1$ from town $2$ to the origin at a speed of $2$, taking a time of $0.5$.
Sample Input 2
2 1
1 1
0 1
100 0
Sample Output 2
3.4142135624
Here is one optimal way to complete the trip.
- Go the distance $1.41\ldots$ from the origin to town $1$ at a speed of $1$, taking a time of $1.41\ldots$.
- Go the distance $1$ from town $1$ to town $2$ at a speed of $1$, taking a time of $1$.
- Go the distance $1$ from town $2$ to the origin at a speed of $1$, taking a time of $1$.
Sample Input 3
1 2
4 4
1 0
0 1
Sample Output 3
4.3713203436
Here is one optimal way to complete the trip.
- Go the distance $1$ from the origin to chest $1$ at a speed of $1$, taking a time of $1$.
- Go the distance $1.41\ldots$ from chest $1$ to chest $2$ at a speed of $2$, taking a time of $0.707\ldots$.
- Go the distance $5$ from chest $2$ to town $1$ at a speed of $4$, taking a time of $1.25$.
- Go the distance $5.65\ldots$ from town $1$ to the origin at a speed of $4$, taking a time of $1.41\ldots$.
这个数据范围,考虑状压dp。
定义 \(dp_{i,j,k}\) 表示走过了集合 \(i\) 的 towns,集合 \(j\) 的 chests,现在到了 \(k\) 点的最短距离。(不妨用 \(n+i\) 表示第 \(i\) 个chests)
然后就可以枚举下一个去哪里,转移应该很简单了。就是算出两点之间的距离,除以 \(j\) 的元素个数就行了。
#include<bits/stdc++.h>
using namespace std;
const int N=13,M=6;
double dp[1<<N][1<<M][N+M],ans;
int n,m,x[N+M],y[N+M],pw[6];
long long sqr(int a)
{
return 1LL*a*a;
}
double dist(int a,int b)
{
return sqrt(sqr(x[a]-x[b])+sqr(y[a]-y[b]));
}
int popcnt(int x)
{
int cnt=0;
while(x)
cnt+=x&1,x>>=1;
return cnt;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%d%d",&x[i],&y[i]);
for(int i=0;i<m;i++)
scanf("%d%d",&x[i+n],&y[i+n]);
for(int i=pw[0]=1;i<=5;i++)
pw[i]=pw[i-1]*2;
for(int i=0;i<(1<<N);i++)
for(int j=0;j<(1<<M);j++)
for(int k=0;k<(N+M);k++)
dp[i][j][k]=1e16;
for(int i=0;i<n;i++)
dp[1<<i][0][i]=dist(n+m,i);
for(int i=0;i<m;i++)
dp[0][1<<i][i+n]=dist(n+m,i+n);
ans=1e16;
for(int i=0;i<(1<<n);i++)
{
for(int j=0;j<(1<<m);j++)
{
int k=popcnt(j);
for(int x=0;x<n;x++)
{
if(!(i>>x&1))
continue;
for(int y=0;y<n;y++)
{
if(x==y||!(i>>y&1))
continue;
dp[i][j][x]=min(dp[i][j][x],dp[i^1<<x][j][y]+dist(x,y)/pw[k]);
}
for(int y=n;y<m+n;y++)
{
if(!(j>>(y-n)&1))
continue;
dp[i][j][x]=min(dp[i][j][x],dp[i^1<<x][j][y]+dist(x,y)/pw[k]);
}
if(i==(1<<n)-1)
ans=min(ans,dp[i][j][x]+dist(x,n+m)/pw[k]);
// printf("%d %d %d %.6lf\n",i,j,x,dp[i][j][x]) ;
}
--k;
for(int x=0;x<m;x++)
{
if(!(j>>x&1))
continue;
for(int y=0;y<n;y++)
{
if(!(i>>y&1))
continue;
dp[i][j][x+n]=min(dp[i][j][x+n],dp[i][j^1<<x][y]+dist(y,x+n)/pw[k]);
}
for(int y=0;y<m;y++)
{
if(!(j>>y&1))
continue;
dp[i][j][x+n]=min(dp[i][j][x+n],dp[i][j^1<<x][y+n]+dist(y+n,x+n)/pw[k]);
}
if(i==(1<<n)-1)
ans=min(ans,dp[i][j][x+n]+dist(x+n,n+m)/pw[k+1]);
// printf("%d %d %d %.6lf\n",i,j,x+n,dp[i][j][x+n]) ;
}
}
}
printf("%.10lf",ans);
}
[ABC274E] Booster的更多相关文章
- 恶意软件伪装“正规军”,撕开Booster Cleaner“画皮”下的真相
经常使用手机浏览器阅读小说的用户都知道,在浏览器页面经常会出现一些推广游戏应用.手机清理应用等应用的弹窗广告.有时出于方便,我们也会选择直接点开这些弹窗广告进行应用下载.但这种行为并不安全,部分恶意应 ...
- 滴滴 App 的质量优化框架 Booster,开源了!
一. 序 当 App 达到一定体量的时候,肯定是要考虑质量优化.有些小问题,看似只有 0.01% 触发率,但是如果发生在 DAU 过千万的产品中,就很严重了. 滴滴这个独角兽的 DAU 早已过千万,自 ...
- 滴滴Booster移动APP质量优化框架 学习之旅 三
推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) 滴滴Booster移动App质量优化框架-学习之旅 二对重复资源 ...
- 滴滴Booster移动APP质量优化框架 学习之旅 二
推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) 续写滴滴Booster移动APP质量优化框架学习之旅,上篇文章分 ...
- 滴滴Booster移动APP质量优化框架 学习之旅
推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) 一.Booster简介 Booster是滴滴最近开源一个的移动应 ...
- IObit Driver Booster 无法更新驱动的解决办法
IObit Driver Booster 无法更新驱动的解决办法:依次打开软件中的 菜单-设置-网络-自定义代理设置-主机:填入210.101.131.231 端口:8080 最后点确定完成. 注意! ...
- 对xgboost中dump_model生成的booster进行解析
xgboost原生包中有一个dump_model方法,这个方法能帮助我们看到基分类器的决策树如何选择特征进行分裂节点的,使用的基分类器有两个特点: 二叉树: 特征可以重复选择,来切分当前节点所含的数据 ...
- angular2系列教程(六)两种pipe:函数式编程与面向对象编程
今天,我们要讲的是angualr2的pipe这个知识点. 例子
- Mac 软件篇
对于美好事务的追求无论何时都不算晚. ** 文章内容来着我整理的fetool,以下内容可能更新不及时 ** Mac 下的软件那么多,又是免费又是付费,应该怎么选呢?我来分享下我的推荐列表,推荐的优先级 ...
- 【软件工具】Driver Booster3永久激活法
原作者網址:erik2041999 (YouTube) 1.安装Driver Booster3 (档案已附) 2.使用此启动码0187E-B9764-4D9FA-211B3断网启动 3.保持断网状态并 ...
随机推荐
- Flutter系列文章-Flutter应用优化
当涉及到优化 Flutter 应用时,考虑性能.UI 渲染和内存管理是至关重要的.在本篇文章中,我们将通过实例深入讨论这些主题,展示如何通过优化技巧改进你的 Flutter 应用. 代码性能优化 1. ...
- 【故障公告】一而再,再而三,三翻四复:数据库服务器 CPU 100%
会员救园,故障捣乱,每当困难时,故障们总是喜欢雪上加霜过来考验你. 今天下班前 17:43~17:47 期间,园子的 SQL Server 数据库服务器突然出现 CPU 100% 问题. 发现问题后, ...
- 一文解锁vue3中hooks的使用姿势
vue3 中的 hooks 是什么? 简单来说如果你的函数中用到了诸如 ref,reactive,onMounted 等 vue 提供的 api 的话,那么它就是一个 hooks 函数,如果没用到它就 ...
- 《Python魔法大冒险》008 石像怪的挑战:运算符之旅
小鱼和魔法师继续深入魔法森林.不久,他们来到了一个巨大的魔法石圈旁边.石圈中心有一个闪闪发光的魔法水晶,周围则是一些神秘的符号.但令人意外的是,水晶的旁边还有一个巨大的石像怪,它的眼睛散发着红色的光芒 ...
- 织梦DedeCMS文章内容页调用标签方法教程
织梦DedeCMS是新手站长使用比较多的建站软件,其模板制作也比较方便,一些站长朋友对其模板调用标签不是太熟悉,小编为大家介绍下织梦文章内容页调用标签的方法. 1.调用文章标题: {dede:fiel ...
- 数据库sql中处理时间冲突问题
数据库现有数据其中两列: s - 开始时间, e - 结束时间. 在新插入数据s', e'之前需要判断两个时间之间是否有重合 因为使用mybatis-plus的缘故, 结论都使用s或e在符号前面. 1 ...
- hash code
值相同却可能有不同的hashcode //对象值到底指什么?(x.equals(y) == true)应该并不代表对象值相同 class A { A(){} public boolean equals ...
- .NET静态代码织入——肉夹馍(Rougamo)发布2.0
肉夹馍(https://github.com/inversionhourglass/Rougamo)通过静态代码织入方式实现AOP的组件,其主要特点是在编译时完成AOP代码织入,相比动态代理可以减少应 ...
- 10月TIOBE榜Java跌出前三!要不我转回C#吧
前言 Java又要完了,又要没了,你没看错,10月编程语言榜单出炉,Java跌出前三,并且即将被C#超越,很多资深人士预测只需两个月,Java就会跌出前五. 看到这样的文章,作为一名Java工程师我感 ...
- python---简单最大类间方差法(OTSU)算法
from matplotlib import pyplot as plt # cv2.imread()用于读取图片文件 # imread函数有两个参数,第一个参数是图片路径,第二个参数表示读取图片的形 ...