参考博客: 春季测试 2023] 圣诞树 题解 - 洛谷专栏 (luogu.com.cn)

题意:给定二维平面上一个凸多边形的 \(n\) 个顶点, 求一种方案,使得从最高点开始,不重复地经过所有点后距离的最小值。只要求输出这种方案。

经典的 TSP 问题。

\(n<=18\) 可以直接状压dp.

\(n<=1000\):

就是要大胆发现一些结论。

根据三角形法则,

对比图1和图2,发现如果电线交叉肯定不优。

所以对于逆时针给定的若干个点,当处于 \(\) 时,最优决策一定只能是下一步到 \(−1\) 或 \(i+1\),否则将会存在一个点被隔离,导致最终去往该点时一定形成交叉路径。并且 \(i\) 之前的决策并不影响当前这一步的决策。

此时无后效性和子问题的雏形已经出现了,考虑动态规划。

  • 定义:\(f[i][j][0/1]\), 区间\([i,j]\), 停在左边界/右边界, 最短距离
  • 转移:
\[f[i][j][0] = \min(dis(i,i+1) + f[i+1][j][0] , dis(i,j) + f[i+1][j][1])
\]
\[f[i][j][1] = \min(dis(j-1,j) + f[i][j-1][1] , dis(i,j) + f[i][j-1][0])
\]
  • 初始化:\(f[s][s][0/1] = 0\), 其他的初始化为 \(inf\)
  • 扩展顺序:先从小到大枚举长度,再从左到右依次枚举所有区间
  • 答案:由\(f[1][n][1]\) 往回倒推(最后一步仍然要遵循三角形法则,所以只考虑 \(f[1][n][1].\))
#include<bits/stdc++.h>
#define F(i,l,r) for(int i(l);i<=(r);++i)
#define G(i,r,l) for(int i(r);i>=(l);--i)
#define int ll
using namespace std;
using ll = long long;
using ull = unsigned long long;
const int N=1e3+5;
const double inf = 1e18;
struct node{
double x,y;
int id;
}a[N],tmp[N];
double f[N][N][2];
int pre[N][N][2];
inline double dis(int i,int j){
return sqrt((a[i].x-a[j].x) * (a[i].x-a[j].x) + (a[i].y-a[j].y) * (a[i].y-a[j].y));
}
int n,k=1;
inline void dfs(int i,int j,int op){
if(i==j) return cout<<a[i].id,void();
if(!op) cout<<a[i].id<<" ",dfs(i+1,j,pre[i][j][0]);
else cout<<a[j].id<<" ", dfs(i,j-1,pre[i][j][1]);
return ;
}
signed main(){
// freopen("tree.in","r",stdin);
// freopen("tree.out","w",stdout);
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin>>n; F(i,1,n) cin>>a[i].x>>a[i].y,a[i].id=i,tmp[i]=a[i];
F(i,2,n) if(a[i].y>a[k].y) k=i;
F(i,1,k) a[i+n-k]=tmp[i];
F(i,k+1,n) a[i-k]=tmp[i];
F(len,2,n-1){
for(int i=1,j=len;j<=n;++i,++j){
f[i][j][0] = f[i][j][1] = inf;
if(dis(i,i+1) + f[i+1][j][0] < dis(i,j) + f[i+1][j][1])
f[i][j][0] = dis(i,i+1) + f[i+1][j][0], pre[i][j][0] = 0;
else
f[i][j][0] = dis(i,j) + f[i+1][j][1], pre[i][j][0] = 1;
if(dis(j-1,j) + f[i][j-1][1] < dis(i,j) + f[i][j-1][0]) f[i][j][1] = dis(j-1,j) + f[i][j-1][1], pre[i][j][1] = 1;
else f[i][j][1] = dis(i,j) + f[i][j-1][0], pre[i][j][1] = 0;
}
}
cout<<a[n].id<<" ";
if(dis(n-1,n) + f[1][n-1][1] > dis(1,n) + f[1][n-1][0]) dfs(1,n-1,0);
else dfs(1,n-1,1);
return fflush(0),0;
}

总结一下,感觉拿到这道题还是没有冷静去分析条件,比如起点固定能不能利用?逆时针给定的这张图的顺序可能长什么样?不是从最高点开始给的图,我怎么通过一些简单的设计去调整?有哪些情况是显然不优的?敢不敢大胆排除?

P9119 [春季测试 2023] 圣诞树的更多相关文章

  1. 2023 年 CCF 春季测试赛模拟赛 - 2 题解

    T1 约数和 标准解法 \(n = a_1^{b_1} \times a_2^{b_2} \dots a_k^{b_k}\) 那么根据算术基本定理的推广,约数个数和约数和都是可以快速计算得到 约数和 ...

  2. 2023 年 CCF 春季测试赛模拟赛 - 2

    T1 分治,\(a^b + \dots + 1 = (a^{\lfloor\frac{b}{2}\rfloor} + \dots + 1) \times (a^{\lfloor\frac{b}{2}\ ...

  3. 2023 年 CCF 春季测试赛模拟赛 - 1

    T1 个人思路: 询问:求 \(1\) 到 \(t_i\) 路径上离 \(1\) 最远的 \(p\),使得 \(dis_{1,p} \times 2 \le d_i\).即 \(dis_{1,t} \ ...

  4. 【kAriOJ】离散数学春季学期编程测试 1

    A.凯撒密码 题意: 给你k1,k2,和一串明文,一串密文. 明文用k1加密,密文用k2解密. 对于明文要把字母转换成大写字母,非字母全部删除. 额:要考虑到取模可能会变成负数,所以要加一下26再取模 ...

  5. 躬身入局,干货分享,2023年春招后端技术岗(Python)面试实战教程,Offer今始为君发

    早春二月,研发倍忙,杂花生树,群鸥竟飞.为什么?因为春季招聘,无论是应届生,还是职场老鸟,都在摩拳擦掌,秣马厉兵,准备在面试场上一较身手,既分高下,也决Offer,本次我们打响春招第一炮,躬身入局,让 ...

  6. 百度前端技术学院(IFE)2016春季学期总结

    今天(5月16日)作为第八个提交者提交了任务五十:RIA微型问卷管理平台 这样一个综合性的大任务,宣告我的IFE春季学期课程学习顺利完成.其实任务五十并不复杂,现在再让我来做,可能一周不到就写出来了, ...

  7. 云server 性能测试web压力测试

    前言:如今,云server主流.它已成为许多中小型企业的首选server,但是云server它是一个虚拟机.所以性能是一个大问题,从这里开始介绍云server性能测试,云webserver压力测试. ...

  8. HDU 2023 求平均成绩

    Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Practice HDU ...

  9. 个人待办事项工具的设计和搭建(IFE前端2015春季 任务3)

    这是我几个月之前的项目作品,花了相当的时间去完善.博客人气不高,但拿代码的人不少,所以一直处于保密状态.没有公开代码.但如果对你有帮助,并能提出指导意见的,我将十分感谢. IFE前端2015春季 任务 ...

  10. Win10《芒果TV》春季商店版更新v3.3.0:全新视觉蜕变&支持快男直播

    在微软发布Win10创意者更新正式版前夕,Win10版<芒果TV>迅速更新至v3.3.0,主要是全新升级视觉交互,新增大咖快男个人直播,全面优化底层架构,启动大提速. Win10版< ...

随机推荐

  1. Unity FpsSample Demo研究

    1.前言 Unity FpsSample Demo大约是2018发布,用于官方演示MLAPI(NetCode前身)+DOTS的一个FPS多人对战Demo. Demo下载地址(需要安装Git LFS) ...

  2. 11. 基于ARM Cortex-A9中断详解

    一.中断概念 操作系统中,中断是很重要的组成部分.出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行. 有了中断系统才可以不用一直 ...

  3. 1055 - Expression #9 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'xxx.xxx.xxx' which is not functionally ...;this is incompatible with sql_mode=only_full_group_by

    MySQL 8 的默认 sql_mode 包含了only_full_group_by,如果想要sql不按照这模式做检查,可以设置当前session的sql_mode值不包含oly_full_group ...

  4. Maven的下载安装配置

    Maven的下载安装配置 Maven是什么 Maven是基于项目对象模型(POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工 ...

  5. 【YashanDB知识库】字段加上索引后,SQL查询不到结果

    [标题]字段加上索引后,SQL查询不到结果 [问题分类]索引功能使用 [关键字]索引,SQL查询,时间类型,vachar字符类型 [问题描述]字段加上索引后,SQL查询不到结果. [问题原因分析]当前 ...

  6. JavaScript – Fetch

    前言 上一篇 JavaScript – XMLHttpRequest 有提到 XMLHttpRequest 正在被 Fetch 取代,这篇就继续介绍 Fetch 吧. 参考 阮一峰 – Fetch A ...

  7. Apache-Shiro <=1.2.4 反序列化漏洞 (代码审计)

    一.Apache Shiro 简介: Apache Shiro提供了认证.授权.加密和会话管理功能,将复杂的问题隐藏起来,提供清晰直观的API使开发者可以很轻松地开发自己的程序安全代码.并且在实现此目 ...

  8. Java中浮点数运算存在的精度问题以及解决方法

    观察以下一段代码,相信小朋友都可以一眼看出答案,但是计算机给出的答案是这样吗? public class TestDouble { public static void main(String arg ...

  9. U179915 关于分级火箭的一点理想化的计算

    题目地址 本题是一道疯狂推式子的玄学复杂度sb题. 解题思路 1.数学部分 ​ 首先假定已经将火箭分成了 \(n+1\) 级,记使用了 \(n\) 个分级器.记各级的开始时间点为: \[0=t_0&l ...

  10. style 标签写在body 前后的区别?

    知识储备:了解浏览器渲染页面的流程 a)首先 , 解析(parse)html 标签 , 获取DOM 树 b)解析html 的同时 , 解析css  , 获得样式规则 (style rules) CSS ...