[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.保持断网状态并 ...
随机推荐
- Unity TextMeshPro 添加中文字体遇见的问题以及解决方案
前言 按标准官方教程为 Unity TextMeshPro 添加中文字体时出现了各种奇奇怪怪的问题,于是有了这篇随笔. 中文字体解决方案 以下步骤适用于 TextMeshPro 3.0.6. 字符数量 ...
- What...MiniGPT-4居然开源了,提前感受 GPT-4 的图像对话能力!
说在前面的话: 一个月前,OpenAI向外界展示了GPT-4如何通过手绘草图直接生成网站,令当时的观众瞠目结舌. 在GPT-4发布会之后,相信大家对ChatGPT的对话能力已有所了解.圈内的朋友们应该 ...
- torch.nn基础学习教程 | PyTorch nn Basic Tutorial
基于torch.nn搭建神经网络的基础教程大纲: 1. 引言 在我们开始深入探讨torch.nn之前,我们首先需要理解PyTorch及其神经网络库的基础知识.这一部分的内容将帮助你对PyTorch有一 ...
- 如何正确实现一个自定义 Exception
最近在公司的项目中,编写了几个自定义的 Exception 类.提交 PR 的时候,sonarqube 提示这几个自定义异常不符合 ISerializable patten. 花了点时间稍微研究了一下 ...
- Matplotlib(一)
Matplotlib(一) Matplotlib库的介绍 Matplotlib库的使用 Matplotlib库由各种可视化类构成,内部结构复杂,受Matlab启发matplotlib.pyplot是绘 ...
- 集群部署专题之二:超高性能RPC框架Zeroc-ICE集群部署简易教程
一.前言 Zeroc ICE在简中互联网的资料十分匮乏,以至于大家线上使用时可能会有所顾虑.其实大家尽可放心,ZerocICE是一款性能和稳定性都非常优秀的RPC组件,这也是我当时选择ZerocICE ...
- Solution Set -「ARC 111」
「ARC 111A」Simple Math 2 Link. \(\lfloor \frac{10^N - kM^2}{M} \rfloor \equiv \lfloor \frac{10^N}{M} ...
- Linux/Unix-CPU-SuperPI-Unixbench性能测试
测试服务器CPU单核及多核SuperPI圆周率测试real和user值,SuperPI是利用CPU的浮点运算能力来计算出π(圆周率),测试系统稳定性和测试CPU计算完后特定位数圆周率所需的时间:及Un ...
- pandas -- DataFrame的级联以及合并操作
博客地址:https://www.cnblogs.com/zylyehuo/ 开发环境 anaconda 集成环境:集成好了数据分析和机器学习中所需要的全部环境 安装目录不可以有中文和特殊符号 jup ...
- C#学习笔记--变量类型的转换
变量类型的转化: 转换原则 同类型的大的可以装小的,小类型的装大的就需要强制转换. 隐式转换: 同种类型的转换: //有符号 long-->int-->short-->sbyte l ...