(AtCoder Beginner Contest 334) --- F - Christmas Present 2 -- 题解

 F - Christmas Present 2 

F - Christmas Present 2

题目大意:    

 思路解析:

        因为他是顺序前往每个孩子的家,前往时必须要带一个礼物,并且最多只能带k个礼物,所以它每次前往最多k个孩子之后就要回到初始点重新出发。

        然后我们直接计算从初始点不回家顺序前往每个孩子的距离之和ans。再维护一个更新数组d[i],更新从i回到初始点,再从初始点到i+1的额外开销。

        再维护一个额外开销总和的数组, dp[i],表示从初始点走到 i个孩子的额外开销之和。

转移方程为 dp[i] = min(dp[j]) + d[i-1]    Math.max(0,i-k)<=j<=i-1。min(dp[j])可以使用线段树维护实现。

        这样我们就可以得到从初始点到第n-1个孩子再到初始点的额外开销之和,ans + dp[n]则为最终答案。

代码实现:

import java.io.*;
import java.math.BigInteger;
import java.util.*;public class Main {static int mod = 998244353;static double[] t = new double[200005];static double[] dp;static int n;public static void main(String[] args) throws IOException {int T = 1;for (int o = 0; o < T; o++) {n = input.nextInt();int k = input.nextInt();int X = input.nextInt();int Y = input.nextInt();int[][] xy = new int[n + 1][2];for (int i = 0; i < n; i++) {xy[i][0] = input.nextInt();xy[i][1] = input.nextInt();}xy[n][0] = X;xy[n][1] = Y;double ans = dist(X, Y, xy[0][0], xy[0][1]);double[] d = new double[n];for (int i = 0; i < n; i++) {double dir = dist(xy[i + 1][0], xy[i + 1][1], xy[i][0], xy[i][1]);double ret = dist(X, Y, xy[i][0], xy[i][1]) + dist(X, Y, xy[i + 1][0], xy[i + 1][1]);ans += dir;d[i] = ret - dir;}dp = new double[n + 1]; // dp[i][1][j] 表示当前已经给了i个孩子,并且在第i个位置,还能再送j个孩子Arrays.fill(dp, Double.MAX_VALUE);Arrays.fill(t, Double.MAX_VALUE);for (int i = 1; i <= n; i++) {double qre = query(Math.max(1, i - k), i-1);if (i - k <= 0) qre = Math.min(qre, 0);dp[i] = qre + d[i - 1];update(i, dp[i]);}ans += dp[n];out.printf("%.9f", ans);}out.flush();out.close();br.close();}public static int lowbit(int x) {return x & (-x);}public static void update(int i, double val) {while (i <= n) {t[i] = Math.min(t[i], val);i += lowbit(i);}}public static double query(int l, int r) {double res = Double.MAX_VALUE;while (r >= l) {res = Math.min(res, dp[r]);r--;while (r - l >= lowbit(r)) {res = Math.min(res, t[r]);r -= lowbit(r);}}return res;}public static double dist(int X, int Y, int x, int y) {return Math.sqrt((long) (X - x) * (X - x) + (long) (Y - y) * (Y - y));}static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));static Input input = new Input(System.in);static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));static class Input {public BufferedReader reader;public StringTokenizer tokenizer;public Input(InputStream stream) {reader = new BufferedReader(new InputStreamReader(stream), 32768);tokenizer = null;}public String next() {while (tokenizer == null || !tokenizer.hasMoreTokens()) {try {tokenizer = new StringTokenizer(reader.readLine());} catch (IOException e) {throw new RuntimeException(e);}}return tokenizer.nextToken();}public String nextLine() {String str = null;try {str = reader.readLine();} catch (IOException e) {// TODO 自动生成的 catch 块e.printStackTrace();}return str;}public int nextInt() {return Integer.parseInt(next());}public long nextLong() {return Long.parseLong(next());}public Double nextDouble() {return Double.parseDouble(next());}public BigInteger nextBigInteger() {return new BigInteger(next());}}}

 

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

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

相关文章

哈工大计算机网络考试经验及资源分享

如果你觉得资源对你有用&#xff0c;在收藏的同时不要忘记点个赞(●◡●)&#xff0c;你的支持&#xff0c;是我坚持创作的最佳动力。 哈工大计算机网络是一门重要的课程&#xff0c;对于学习计算机网络知识非常有帮助。在学习这门课程时&#xff0c;我选择了中科大zq老师的网…

二叉树的垂直遍历

1.题目 这道题是2024-2-13的签到题&#xff0c;题目难度为困难。 考察的知识点是DFS算法和自定义排序。 题目链接&#xff1a;二叉树的垂直遍历 给你二叉树的根结点 root &#xff0c;请你设计算法计算二叉树的 垂序遍历 序列。 对位于 (row, col) 的每个结点而言&#xff…

VTK 正交投影 透视投影

1.VTK默认透视投影&#xff08;近大远小&#xff09;&#xff1b; 1.调用vtkCamera的ParallelProjectionOn函数开启 2.通过vtkCamera的SetParallelScale缩放 3.通过vtkCamera的SetClippingRange设置前后裁剪平面 2.正交投影&#xff08;平行投影&#xff0c;远近一样&#xf…

openGauss学习笔记-218 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-I/O

文章目录 openGauss学习笔记-218 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-I/O218.1 查看I/O状况218.2 性能参数分析 openGauss学习笔记-218 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-I/O 获取openGauss节点的CPU、内存、I/O和网络资源使用情况&#xf…

LeetCode:83和82.删除排序链表中的重复元素I,II

这两题算是链表的基础题&#xff0c;就遍历删除没啥特点&#xff0c; 83甚至不需要考虑第一个结点的特殊情况&#xff0c;属实是名副其实的easy了 LeetCode&#xff1a;21.合并两个有序链表之第一次的特殊情况-CSDN博客 83. 删除排序链表中的重复元素 - 力扣&#xff08;Lee…

第三百二十二回

文章目录 1. 概念介绍2. 使用方法2.1 基本用法2.2 缓冲原理 3. 示例代码4. 内容总结 我们在上一章回中介绍了"FadeInImage组件"相关的内容&#xff0c;本章回中将介绍CachedNetworkImage组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章…

渗透测试练习题解析 3(CTF web)

1、[网鼎杯 2020 朱雀组]phpweb 1 考点&#xff1a;反序列化漏洞利用 进入靶场&#xff0c;查看检查信息&#xff0c;发现存在两个参数 func 和 p 查看页面源代码 payload&#xff1a;funcfile_get_contents&pphp://filter/resourceindex.php 整理后&#xff0c;就是 PHP 代…

HiveSQL——连续增长问题

注&#xff1a;参考文章&#xff1a; SQL连续增长问题--HQL面试题35_sql判断一个列是否连续增长-CSDN博客文章浏览阅读2.6k次&#xff0c;点赞6次&#xff0c;收藏30次。目录0 需求分析1 数据准备3 小结0 需求分析假设我们有一张订单表shop_order shop_id,order_id,order_time…

基于Java (spring-boot)的职工管理系统

一、项目介绍 基于Java (spring-boot)的职工管理系统功能&#xff1a;登录、老板、职员人事经理、职员、部门列表、职工列表、权限修改、查看所有管理、正在审核列表、添加考勤、添加职工、添加奖惩、合同列表、合同信息、等等等。 适用人群&#xff1a;适合小白、大学生、毕业…

【Java八股面试系列】JVM-类和对象加载过程

目录 类和对象的加载过程 类的生命周期 类的加载过程 加载 验证 准备 解析 初始化 类卸载 对象的加载过程 类和对象的加载过程 什么是类加载和对象加载? 类加载&#xff08;Class Loading&#xff09;&#xff1a;这是指JVM在运行时将类的字节码文件加载到内存中的…

利用pandas库进行数据分析

一.这段代码的主要目的是读取IMDB电影数据集&#xff0c;并进行一些基本的数据分析 # codingutf-8 import pandas as pd import numpy as np from matplotlib import pyplot as plt# 定义CSV文件的路径 file_path ./IMDB-Movie-Data.csv# 使用pandas的read_csv函数读取CSV文件…

海量数据处理商用短链接生成器平台 - 3

第三章 商用短链平台实战-账号微服务流量包设计 第1集 账号微服务和流量包数据库表索引规范讲解 简介&#xff1a;账号微服务和流量包数据库表索引规范讲解 索引规范 主键索引名为 pk_字段名; pk即 primary key;唯一索引名为 uk_字段名&#xff1b;uk 即 unique key普通索引…