Atcoder Beginner Contest 374 D题题解

news/2024/10/7 14:47:34/

一. 题目描述

题目传送门 - Atcoder Beginner Contest 374 D - Laser Marking

二. 思路分析

1.题目大意

在平面上给你一个激光(可看作一个点)和若干条线段(左右端点分别为 ( a i , b i ) (a_i,b_i) (ai,bi) ( c i , d i ) (c_i,d_i) (ci,di) 。激光在线段上非线段上的速度分别为 s , t s,t s,t 。现在问激光 ( 0 , 0 ) (0,0) (0,0) 开始完全走过每条线段(即对于每条线段,激光必须 ( a i , b i ) (a_i,b_i) (ai,bi) 连续不断地走到 ( c i , d i ) (c_i,d_i) (ci,di) )所用的最短时间是多少。

2.思路分析

先看数据范围:

  • 1 ≤ N ≤ 6 1 \le N \le 6 1N6

发现线段的数量非常少,考虑枚举

我们发现,激光的移动可以表示为以下几步

  1. 激光从 ( 0 , 0 ) (0,0) (0,0) 移到一个线段端点。
  2. 激光沿线段从一个端点到另一个端点。
  3. 激光从该线段另一个端点到另一条线段的一个端点。
  4. 重复步骤 2,3 直到经过所有线段。

可以发现,我们只需要枚举线段的顺序,即先移到哪个线段端点,后移到哪个线段的端点。又因为对于每一条线段有两个端点,那么从两端出发都是可以的,也就需要在枚举每一条线段时再枚举两个端点即可。

3.要点提示

  • 精度问题,存储与计算坐标时用 double
  • 两点 A ( x 1 , y 1 ) , B ( x 2 , y 2 ) A(x1,y1),B(x2,y2) A(x1,y1),B(x2,y2)距离公式(由勾股定理可得):
    A B = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 AB = \sqrt{(x1-x2)^2+(y1-y2)^2} AB=(x1x2)2+(y1y2)2
  • 二进制枚举/深搜dfs 枚举线段的两个端点作为起始点。
  • 起点在 ( 0 , 0 ) (0,0) (0,0)

三. 代码实现

#include <bits/stdc++.h>
using namespace std;
int n,t,s,p[8] = {0,1,2,3,4,5,6,7};
double a[8],b[8],c[8],d[8],ans = 1e9;
double dis(double a1,double b1,double a2,double b2)
{return sqrt((a1-a2)*(a1-a2)+(b1-b2)*(b1-b2));
}
int main()
{cin >> n >> s >> t;for (int i=1;i<=n;i++){cin >> a[i] >> b[i] >> c[i] >> d[i];}do{for (int i=0;i<(1<<(n+1));i++) //二进制枚举线段两个端点{double res = 0,l = 0,r = 0; //起点在(0,0)for (int j=1;j<=n;j++){if (i & (1 << j)){res += dis(l,r,a[p[j]],b[p[j]])/s;l = a[p[j]];r = b[p[j]];res += dis(l,r,c[p[j]],d[p[j]])/t;l = c[p[j]];r = d[p[j]];}else{res += dis(l,r,c[p[j]],d[p[j]])/s;l = c[p[j]];r = d[p[j]];res += dis(l,r,a[p[j]],b[p[j]])/t;l = a[p[j]];r = b[p[j]];}}if (res < ans) //更新最小值{ans = res;}}} while (next_permutation(p+1,p+n+1)); //全排列printf("%.20f",ans);return 0;
}

四. 总结

很考验功底,主要靠暴力求解,但是需要掌握全排列,二进制枚举等技巧,还需要进行转化。总之是一道练习暴力求解的好题。


http://www.ppmy.cn/news/1535738.html

相关文章

怎么不改变视频大小的情况下,修改视频的时长

视频文件太大怎么变小&#xff1f;不影响画质的四种方法 怎么不改变视频大小的情况下,修改视频的时长 截取结尾的时间你可以使用 ffmpeg 来裁剪视频的结尾部分。假设你想去掉视频最后的3秒钟&#xff0c;可以先使用 ffmpeg 获取视频的总时长&#xff0c;然后通过指定一个新的…

《论文阅读》PECER:通过动态人格提取和情境情绪推理产生同理心反应 ICASSP 2024

《论文阅读》PECER:通过动态人格提取和情境情绪推理产生同理心反应 ICASSP 2024 前言简介任务定义模型架构Cognitive-Affective Personality PerceiverMulti-source EncoderInteractive Decoder损失函数实验结果可持续发展观点前言 亲身阅读感受分享,细节画图解释,再也不用…

房地产销售|基于springBoot的房地产销售管理系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 社会和科技的不断进步带来更便利的生活&#xff0c;计算机技术也越来…

[Linux][进程] 环境变量

环境变量是由操作系统赋给程序的用于描述当前状态的变量,一般由命令行解释器进程赋值. PATH环境变量 PATH是一个环境变量,内部存放的路径下的文件可以被直接执行而不用加路径 指令 echo $PATH 查看系统指令的文件根目录 当系统执行我们自己写的指令时需要[路径/程序名],而执行…

【简介Sentinel-1】

Sentinel-1是欧洲航天局哥白尼计划&#xff08;GMES&#xff09;中的地球观测卫星&#xff0c;由Sentinel-1A和Sentinel-1B两颗卫星组成。以下是对Sentinel-1的详细介绍&#xff1a; 一、基本信息 卫星名称&#xff1a;Sentinel-1 所属计划&#xff1a;欧洲航天局哥白尼计划…

R语言中的plumber介绍

R语言中的plumber介绍 基本用法常用 API 方法1. GET 方法2. POST 方法3. 带路径参数的 GET 方法 使用 R 对数据进行操作处理 JSON 输入和输出运行 API 的其他选项其他功能 plumber 是个强大的 R 包&#xff0c;用于将 R 代码转换为 Web API&#xff0c;通过使用 plumber&#x…

ISO IEC 18004 2015 PDF 文字版下载

ISO_IEC_18004_2015_en-US - 道客巴巴 (doc88.com)https://www.doc88.com/p-67816330893254.html

GO网络编程(五):海量用户通信系统3:整体框架与C/S通信总体流程【重要】

这个系统其实是尚硅谷的老韩讲的&#xff08;尚硅谷网络编程项目&#xff09;&#xff0c;但是他讲得很碎片化&#xff0c;思路不够清晰&#xff0c;时间又长&#xff0c;所以要掌握还是挺难的。如果你听了他的视频&#xff0c;不去梳理系统业务流程&#xff0c;不去看代码就往…