Codeforces Beta Round 8 C. Looking for Order 【状压DP】

C. Looking for Order

C

题意

平面直角坐标系上有 n n n 个物品,还有一个初始背包位置 ( x 0 , y 0 ) (x_0, y_0) (x0,y0),从背包位置出发,每次最多携带两个物品回来背包,求把所有物品带回背包位置要走的最短距离,并给出详细方案

思路

2

看上面这张图,如果我们从 0 0 0 号点出发,每次只访问一个点的话,这样子访问两个点的总距离是: 2 a + 2 b 2a + 2b 2a+2b,但是如果我们一次访问两个点再回去背包:

3

这样子的总距离是: a + b + c a + b + c a+b+c,与前一种情况相比,少了 ( a + b ) (a + b) (a+b),多了 c c c 的距离,但是由于三角形两边之和大于第三边: a + b > c a + b > c a+b>c,所以 2 a + 2 b > a + b + c 2a + 2b > a + b + c 2a+2b>a+b+c,也就是第二种情况一定更优。

观察到这一个关键点后,我们可以给出结论:一定是两两访问,如果 n n n 是奇数,剩下的某个点单独访问。并且两两访问的先后顺序是无关的,可以先访问也可以后访问,彼此之间不影响最终答案。问题是:谁和谁组合在一起被访问。

这里我们考虑状压 D P DP DP,定义 d p [ S ] [ i ] dp[S][i] dp[S][i] 为访问状态为 S S S 且最后一个访问的点是 i i i 的最短距离。那么转移我们只需要枚举 S S S 中为 0 0 0 的那些位,枚举一个两个。由于这道题的访问先后顺序是无关的,那么对于当前 S S S 0 0 0 的那些位,最终一定要被访问的,那么我们先考虑最低位的那个没被访问的点也无妨,假设为 i i i,看看 i i i 是和某个点组合在一起访问更好,还是它自己单独被访问更好,我们可以通过枚举 j j j i → i \rightarrow i 更高位为 0 0 0 的那些位来实现这个转移过程

#include<bits/stdc++.h>
#define fore(i,l,r)	for(int i=(int)(l);i<(int)(r);++i)
#define fi first
#define se second
#define endl '\n'
#define ull unsigned long long
#define ALL(v) v.begin(), v.end()
#define Debug(x, ed) std::cerr << #x << " = " << x << ed;
#define lowbit(x) ((x) & -(x))const int INF=0x3f3f3f3f;
const long long INFLL=1e18;typedef long long ll;const int N = 24;
int dp[1 << N];
std::pair<int,int> p[N + 1];
int path[1 << N];int dis(int i, int j){int d1 = std::abs(p[i].fi - p[j].fi);int d2 = std::abs(p[i].se - p[j].se);return d1 * d1 + d2 * d2;
}int main(){std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);std::cin >> p[0].fi >> p[0].se;int n;std::cin >> n;fore(i, 1, n + 1)   std::cin >> p[i].fi >> p[i].se;memset(dp, INF, sizeof(dp));dp[0] = 0;fore(S, 0, 1 << n){if(dp[S] == INF) continue;fore(i, 0, n)if(!(S >> i & 1)){fore(j, i, n)if(!(S >> j & 1))if(dp[S] + dis(0, i + 1) + dis(i + 1,j + 1) + dis(j + 1, 0) < dp[S | 1 << i | 1 << j]){dp[S | 1 << i | 1 << j] = dp[S] + dis(0, i + 1) + dis(i + 1 ,j + 1) + dis(j + 1, 0);path[S | 1 << i | 1 << j] = S; //path记录是从哪个状态转移过去的}break;}}std::cout << dp[(1 << n) - 1] << endl;int S = (1 << n) - 1;std::cout << 0 << ' ';while(S){int mv = S ^ path[S]; //得到不同的那些位置,就是组合在一起被访问的点int i = std::__lg(lowbit(mv)) + 1;std::cout << i << ' ';mv -= lowbit(mv);if(mv){i = std::__lg(lowbit(mv)) + 1;std::cout << i << ' ';}std::cout << "0 ";S = path[S];}return 0;
}

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

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

相关文章

[python]基于Ultra-Fast-Lane-Detection-v2车道线实时检测onnx部署

【论文地址】 https://arxiv.org/pdf/2206.07389.pdf 【框架地址】 https://github.com/cfzd/Ultra-Fast-Lane-Detection-v2 【框架介绍】 Ultra-Fast-Lane-Detection-v2&#xff08;UFL-D-v2&#xff09;算法是一种高效的车道线检测算法&#xff0c;它旨在快速准确地识别…

ElementUI Form:Form表单

ElementUI安装与使用指南 Form表单 点击下载learnelementuispringboot项目源码 效果图 el-form.vue&#xff08;Form表单&#xff09;页面效果图 项目里 el-form.vue代码 <script> export default {name: el_form,data() {var checkAge (rule, value, callback…

论文阅读-一种用于大规模分布式文件系统中基于深度强化学习的自适应元数据管理方案

名称&#xff1a; An Adaptive Metadata Management Scheme Based on Deep Reinforcement Learning for Large-Scale Distributed File Systems I. 引言 如今&#xff0c;大型集群文件系统的规模已达到PB甚至EB级别&#xff0c;由此产生的数据呈指数级增长。系统架构师不断设…

ai创作软件有哪些?这5个软件了解一下

ai创作软件有哪些&#xff1f;随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;在各个领域都展现出了惊人的实力。特别是在内容创作领域&#xff0c;AI技术已经成为了助力创作者们提高效率、释放创意的得力助手。今天&#xff0c;我们将为大家介绍五款AI创作…

指针的学习2

目录 数组名的理解 使用指针访问数组 一维数组传参的本质 冒泡排序 二级指针 指针数组 指针数组模拟二维数组 数组名的理解 数组名是数组首元素的地址 例外&#xff1a; sizeof(数组名),sizeof中单独放数组名&#xff0c;这里的数组名表示整个数组&#xff0c;计算的…

Mybatis Plus 结合 Mybatis X 插件快速生成CRUD代码

Mybatis Plus 结合 Mybatis X 插件快速生成CRUD代码 本文介绍在 IDEA 中如何使用 Mybatis X 插件快速生成 Mybatis Plus 的 CRUD 代码。包括实体类 model 代码、持久层 Mapper 代码和与之对应的Mapper.xml 代码、服务层 service 接口与impl接口实现类代码 1.安装Mybatis X 插…

蓝桥杯---生日蜡烛

某君从某年开始每年都举办一次生日party&#xff0c;并且每次都要吹熄与年龄相同根数的蜡烛&#xff0c;现在算起来&#xff0c;他一共吹熄了236根蜡烛。请问,他从多少岁开始过生日party的? 请填写他开始过生日 party的年龄数。 注意:你提交的应该是一个整数&#xff0c;不要…

【JavaScript 漫游】【006】数据类型 array

文章简介 本文为【JavaScript 漫游】专栏的第 006 篇文章&#xff0c;记录笔者在了解 JS 数据类型 array 中摘录的知识点。 数组的本质是对象属组的 length 属性for ... in 循环和数组的遍历数组的空位类数组对象 除了上述 5 个重要知识点&#xff0c;学习数组更为重要的是掌…

golang开源的可嵌入应用程序高性能的MQTT服务

golang开源的可嵌入应用程序高性能的MQTT服务 什么是MQTT&#xff1f; MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的、开放的消息传输协议&#xff0c;设计用于在低带宽、高延迟或不可靠的网络环境中进行通信。MQTT最初由IBM开发&#xf…

fastjson 导致的OOM

fastjson 导致的OOM 示例代码 public static void main(String[] args) throws Exception {try {List<Integer> list JSONObject.parseArray("[2023,2024", Integer.class);}catch (Exception e){System.err.println("error");}System.out.println…

【Java集合框架ArrayList、LinkedList、HashSet之间的区别】

Java集合框架ArrayList、LinkedList、HashSet之间的区别 1. 实现方式&#xff1a;2. 插入和删除操作的效率&#xff1a;3. 随机访问的效率&#xff1a;4. 内存占用&#xff1a;综上所述&#xff0c;选择ArrayList还是LinkedList或HashSet取决于具体的使用场景。如果需要频繁的插…

Javascript入门:第三个知识点:javascript里的数据类型、运算符

数字类型 123 //整数 123.1 //浮点数 1.123e3 //科学计数法 -10 //负数 NaN //not a number Infinity //无限大 以上的类型在javascript里都是数字类型 字符串类型 在开始之前&#xff0c;我需要先说明白两个知识点&#xff1a; console.log()是啥&#xff1f; let 与 v…