当前位置: 首页 > article >正文

Teleporters( Educational Codeforces Round 126 (Rated for Div. 2) )

Teleporters( Educational Codeforces Round 126 (Rated for Div. 2) )

There are n + 1 n+1 n+1 teleporters on a straight line, located in points 0 0 0, a 1 a_1 a1, a 2 a_2 a2, a 3 a_3 a3, …, a n a_n an. It’s possible to teleport from point x x x to point y y y if there are teleporters in both of those points, and it costs ( x − y ) 2 (x-y)^2 (xy)2 energy.

You want to install some additional teleporters so that it is possible to get from the point 0 0 0 to the point a n a_n an (possibly through some other teleporters) spending no more than m m m energy in total. Each teleporter you install must be located in an integer point.

What is the minimum number of teleporters you have to install?

Input

The first line contains one integer n n n ( 1 ≤ n ≤ 2 ⋅ 1 0 5 1 \le n \le 2 \cdot 10^5 1n2105).

The second line contains n n n integers a 1 , a 2 , … , a n a_1, a_2, \dots, a_n a1,a2,,an ( 1 ≤ a 1 < a 2 < a 3 < ⋯ < a n ≤ 1 0 9 1\le a_1 < a_2 < a_3 < \dots < a_n \le 10^9 1a1<a2<a3<<an109).

The third line contains one integer m m m ( a n ≤ m ≤ 1 0 18 a_n \le m \le 10^{18} anm1018).

Output

Print one integer — the minimum number of teleporters you have to install so that it is possible to get from 0 0 0 to a n a_n an spending at most m m m energy. It can be shown that it’s always possible under the constraints from the input format.

Examples

Input

Copy

2
1 5
7

Output

Copy

2

Input

Copy

2
1 5
6

Output

Copy

3

Input

Copy

1
5
5

Output

Copy

4

Input

Copy

1
1000000000
1000000043

Output

Copy

999999978

好的,下面是问题的中文解答。

问题分析:

我们需要解决一个类似于“给定一个数组,如何通过贪心策略和二分法优化选择分段策略”的问题。通过右到左的贪心策略,能够清晰地确定每个位置的最优决策。我们需要对数组 b 进行操作,逐步减少它的元素,并在此过程中管理一系列的变量来控制进度和代价。我们将使用如下的关键变量:

关键变量:
  • sum:表示当前已有的进度所需从当前元素中扣除的总量。
  • cnt:表示当前活动的进度数量。
  • closed:一个长度为 n 的数组,其中 closed[i] 表示在位置 i+1 结束的进度数量。
  • b:表示每段区间的距离(或能量),我们会根据当前进度动态调整它。
解决思路:
  1. 从右到左的贪心处理:
    我们从右往左处理数组 b,这样可以确保在每个步骤中清楚知道当前进度的影响,避免因未来的选择影响当前决策。每个位置 i 的值 b[i] 需要被当前的进度影响,并决定是否需要添加新的进度。

  2. 更新进度:
    当我们考虑到元素 b[i] 时,首先会根据当前的 sum (减去当前进度的总量)来更新 b[i]。如果 b[i] 大于 0,则我们需要增加新的进度。每个新进度的大小是 el = min(k, i + 1),表示每个进度所能影响的最大范围。

    然后,我们计算需要多少个进度来满足 b[i],公式如下:
    need = ⌈ b [ i ] e l ⌉ \text{need} = \lceil \frac{b[i]}{el} \rceil need=elb[i]
    其中,el 是每个进度能处理的最大距离(即 min(k, i + 1))。

  3. 更新进度状态:

    • 每次我们添加 need 个新的进度,就更新总进度 sum,将 sum 增加 el * need
    • 更新 cnt,增加 need
    • 同时,更新 closed 数组,表示哪些进度会在当前索引之前结束。
  4. 时间复杂度:
    由于我们是从右到左处理数组并且每步仅执行常数时间操作,因此时间复杂度为 O(n),这是非常高效的。

二分法优化:

在这个问题中,我们需要合理地管理每个区间的传送器数量。假设我们可以将每个区间的长度为 len,放置 x 个传送器,计算所需的代价。该代价计算公式为:

f ( l e n , x ) = ( x − ( l e n m o d ( x + 1 ) ) ) × ( ⌊ l e n + 1 x + 1 ⌋ ) 2 + ( l e n m o d ( x + 1 ) ) × ( ⌈ l e n + 1 x + 1 ⌉ ) 2 f(len, x) = (x - (len \mod (x + 1))) \times \left(\left\lfloor \frac{len + 1}{x + 1} \right\rfloor \right)^2 + (len \mod (x + 1)) \times \left(\left\lceil \frac{len + 1}{x + 1} \right\rceil \right)^2 f(len,x)=(x(lenmod(x+1)))×(x+1len+1)2+(lenmod(x+1))×(x+1len+1)2

通过这个公式,我们可以看出,随着传送器数量 x 的增加,每段的代价减少的幅度是单调不增的。因此,我们可以使用二分法来优化我们所需要的最小代价。

算法步骤:
  1. 二分法搜索: 我们通过二分法搜索传送器数量 x,以最小化每段的代价,并确保总代价不超过给定的最大值 m

  2. 计算总代价: 在每次二分搜索过程中,我们计算相应的总代价,并更新最优解。

  3. 贪心策略: 一旦确定了每段最优的传送器数量,我们就可以按贪心策略将传送器分配到各个区间,确保总代价最小。

关键的数学公式
  1. 对于一段距离 len,如果我们需要安装 x 个传送门,则每段之间的平均距离为 len / (x + 1),我们可以通过这个公式来计算每段所需的额外能量。

  2. 对于每段距离的能量消耗计算,使用 f(len, x) 来表示在该段上安装 x 个传送门的总代价,可以通过分段函数来计算。

代码分析

#include <map>
#include <set>
#include <fstream>
#include <queue>
#include <deque>
#include <stack>
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <bitset>
#include <iomanip>
#define endl '\n'
#define int long long
#define Max(a, b) (((a) > (b)) ? (a) : (b))
#define Min(a, b) (((a) < (b)) ? (a) : (b))
#define BoBoowen ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
using namespace std;const int inf = 1e9 + 7;
const int N = 2e5 + 10;
int n;
int a[N];
int d[N];
int ans, m;
int cnt, cost;int dodo(int k, int len)
{if (k > len){return len;}int num = len / k;int res = len % k;return num * num * (k - res) + (num + 1) * (num + 1) * res;
}int check(int x)
{cnt = 0, cost = 0;for (int i = 1; i <= n; ++i){int l = 1, r = d[i];int ans = 1;while (l <= r){int mid = (l + r) / 2;if (dodo(mid, d[i]) - dodo(mid + 1, d[i]) >= x){ans = mid + 1;l = mid + 1;}else{r = mid - 1;}}cnt += ans - 1;cost += dodo(ans, d[i]);}return cost <= m;
}void solved()
{cin >> n;for (int i = 1; i <= n; ++i){cin >> a[i];d[i] = a[i] - a[i - 1];}cin >> m;int l = 0, r = 1e18;int save = 0;while (l <= r){int mid = (l + r) / 2;if (check(mid)){l = mid + 1;save = mid;}else{r = mid - 1;}}check(save);cnt -= (m - cost) / save;cout << cnt;
}signed main()
{BoBoowen;int T = 1;while (T--){solved();}
}
代码解释
  1. dodo 函数:计算在一个区间内安装一定数量传送门的代价。这个函数帮助我们计算每个区间内根据给定的传送门数量需要的能量。

  2. check 函数:检查在给定的 x 值下,是否能在总消耗能量不超过 m 的情况下,满足从 0a_n 的路径。使用二分查找来优化传送门的安装。

  3. 主函数 solved:初始化数据并调用二分查找来找到最小的 x,并根据该 x 值计算出最小的传送门数量。

时间复杂度
  1. dodo 函数:每次计算需要 O(1) 时间。
  2. check 函数:对每个区间进行二分查找,时间复杂度为 O(n log n)。
  3. 总体时间复杂度:O(n log n),适合题目中最大的输入规模。

总结

这个问题是一个典型的优化问题,可以使用贪心策略和二分查找结合来解决。通过区间分割和计算每段距离所需的传送门数量,最终得到最优解。

相关文章:

Teleporters( Educational Codeforces Round 126 (Rated for Div. 2) )

Teleporters&#xff08; Educational Codeforces Round 126 (Rated for Div. 2) &#xff09; There are n 1 n1 n1 teleporters on a straight line, located in points 0 0 0, a 1 a_1 a1​, a 2 a_2 a2​, a 3 a_3 a3​, …, a n a_n an​. It’s possible to tele…...

css-设置元素的溢出行为为可见overflow: visible;

1.前言 overflow 属性用于设置当元素的内容溢出其框时如何处理。 2. overflow overflow 属性的一些常见值&#xff1a; 1 visible&#xff1a;默认值。内容不会被剪裁&#xff0c;会溢出元素的框。 2 hidden&#xff1a;内容会被剪裁&#xff0c;不会显示溢出的部分。 3 sc…...

python-leetcode-从中序与后序遍历序列构造二叉树

106. 从中序与后序遍历序列构造二叉树 - 力扣&#xff08;LeetCode&#xff09; # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right r…...

绝对值线性化

函数中的绝对值线性化有多种方法&#xff0c;包括我之前的一篇博文. 前几天在小红书刷到一个帖子&#xff0c;一位网友提供了另外一种巧妙的方式&#xff0c;记录如下。 假如有一个绝对值表达式&#xff1a; y ∣ a x − b ∣ (1) y|ax-b|\tag{1} y∣ax−b∣(1) 令&#x…...

Java实战:图像浏览器

文章目录 1. 实战概述2. 知识准备3. 实现步骤3.1 创建Java项目3.2 创建图像浏览器类3.2.1 声明变量与常量3.2.2 创建构造方法3.2.3 创建初始化界面方法3.2.4 创建处理事件方法3.2.5 创建主方法3.2.6 查看完整代码 3.3 运行程序&#xff0c;查看结果 4. 实战小结5. 扩展练习 1. …...

SARIMA介绍

SARIMA模型&#xff0c;即季节性自回归积分移动平均模型&#xff08;Seasonal Autoregressive Integrated Moving Average Model&#xff09;&#xff0c;是一种用于处理和预测具有明显季节性变化的时间序列数据的统计模型。它是ARIMA模型的一种扩展&#xff0c;通过引入额外的…...

I.MX6ULL 中断介绍上

i.MX6ULL是NXP&#xff08;原Freescale&#xff09;推出的一款基于ARM Cortex-A7内核的微处理器&#xff0c;广泛应用于嵌入式系统。在i.MX6ULL中&#xff0c;中断&#xff08;Interrupt&#xff09;是一种重要的机制&#xff0c;用于处理外部或内部事件&#xff0c;允许微处理…...

Spring Boot WebMvcConfigurer:定制你的 Web 应用

在构建基于Spring Boot的Web应用程序时&#xff0c;WebMvcConfigurer接口扮演着至关重要的角色。它允许开发者以一种简洁且非侵入的方式自定义Spring MVC的功能&#xff0c;而无需直接扩展框架的核心组件。本文将深入探讨WebMvcConfigurer的作用、如何实现其方法以及在实际项目…...

(即插即用模块-特征处理部分) 十九、(NeurIPS 2023) Prompt Block 提示生成 / 交互模块

文章目录 1、Prompt Block2、代码实现 paper&#xff1a;PromptIR: Prompting for All-in-One Blind Image Restoration Code&#xff1a;https://github.com/va1shn9v/PromptIR 1、Prompt Block 在解决现有图像恢复模型时&#xff0c;现有研究存在一些局限性&#xff1a; 现有…...

单链表专题(中)

我们接着上一篇文章&#xff0c;继续对单链表的实现进行扩充 链表的头删 我们在进行头删的时候&#xff0c;不能先释放掉头节点再将头节点传到第二节点上&#xff0c;这样会导致找不到第二个节点了 void SLTPopFront(SLTNode** pphead) {assert(pphead && *pphead);…...

表格结构标签

<!-- thead表示表格的头部 tbody表示表格的主体 --> <thead></thead> <tbody></tbody> <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content&q…...

A星算法两元障碍物矩阵转化为rrt算法四元障碍物矩阵

对于a星算法obstacle所表示的障碍物障碍物信息&#xff0c;每行表示一个障碍物的坐标&#xff0c;例如2 , 3; % 第一个障碍物在第二行第三列&#xff0c;也就是边长为1的正方形障碍物右上角横坐标是2&#xff0c;纵坐标为3&#xff0c;障碍物的宽度和高度始终为1.在rrt路径规划…...

MySQL数据库(二)- SQL

目录 ​编辑 一 DDL (一 数据库操作 1 查询-数据库&#xff08;所有/当前&#xff09; 2 创建-数据库 3 删除-数据库 4 使用-数据库 (二 表操作 1 创建-表结构 2 查询-所有表结构名称 3 查询-表结构内容 4 查询-建表语句 5 添加-字段名数据类型 6 修改-字段数据类…...

数据分析系列--⑦RapidMiner模型评价(基于泰坦尼克号案例含数据集)

一、前提 二、模型评估 1.改造⑥ 2.Cross Validation算子说明 2.1Cross Validation 的作用 2.1.1 模型评估 2.1.2 减少过拟合 2.1.3 数据利用 2.2 Cross Validation 的工作原理 2.2.1 数据分割 2.2.2 迭代训练与测试 ​​​​​​​ 2.2.3 结果汇总 ​​​​​​​ …...

19 压测和常用的接口优化方案

高并发的平台应用&#xff0c;项目上线前离不开一个重要步骤就是压测&#xff0c;压测对于编码中的资源是否问题的排查&#xff0c;性能的调优都是离不开的。测试还要做测试报告&#xff0c;出具了测试报告给到运维团队才能上线。 压测的测试报告主要有以下几个方面:1.响应时间…...

gentoo中利用ollama运行DeepSeek-R1

一、安装ollama gentoo linux中 1.安装步骤&#xff1a; Step1. #cd /usr/local/src Step2. #wget2 -o -V https://ollama.com/install.sh Setp3. #sh ./install.sh 2.ollama完成安装。查看ollama版本&#xff1a; 3.查看ollama服务运行状态&#xff1a; 二、安装&#xf…...

远程连接-简化登录

vscode通过ssh连接远程服务器免密登录&#xff08;图文&#xff09;_vscode ssh-CSDN博客...

PHP中配置 variables_order详解

variables_order 是 PHP 配置文件 php.ini 中的一项配置指令&#xff0c;决定了 PHP 在处理请求时&#xff0c;哪些类型的变量将被注册到全局变量空间&#xff08;如 $GLOBALS&#xff09;中&#xff0c;以及这些变量的顺序。理解和正确配置 variables_order 对于开发和维护安全…...

为什么推荐将静态资源放在CDN上?

1. CDN 是什么&#xff1f; CDN&#xff08;Content Delivery Network&#xff09;是一种分布式网络&#xff0c;由地理上分散的服务器节点组成。其主要功能是将静态资源缓存到各地的边缘服务器上&#xff0c;从而将内容更快地传递给用户。当用户请求资源时&#xff0c;CDN 会…...

【NEXT】网络编程——上传文件(不限于jpg/png/pdf/txt/doc等),或请求参数值是file类型时,调用在线服务接口

最近在使用华为AI平台ModelArts训练自己的图像识别模型&#xff0c;并部署了在线服务接口。供给客户端&#xff08;如&#xff1a;鸿蒙APP/元服务&#xff09;调用。 import核心能力&#xff1a; import { http } from kit.NetworkKit; import { fileIo } from kit.CoreFileK…...

工作总结:压测篇

前言 压测是测试需要会的一项技能&#xff0c;作为开发&#xff0c;有点时候也要会一点压测。也是被逼着现学现卖的。 一、压测是什么&#xff0c;以及压测工具的选择 压测&#xff0c;即压力测试&#xff0c;是一种性能测试手段&#xff0c;通过模拟大量用户同时访问系统&am…...

MySQL基本架构SQL语句在数据库框架中的执行流程数据库的三范式

MySQL基本架构图&#xff1a; MySQL主要分为Server层和存储引擎层 Server层&#xff1a; 连接器&#xff1a;连接客户端&#xff0c;获取权限&#xff0c;管理连接 查询缓存&#xff08;可选&#xff09;&#xff1a;在执行查询语句之前会先到查询缓存中查看是否执行过这条语…...

CSS 中调整元素大小的全面指南

CSS 中调整元素大小的全面指南 1. 原始尺寸&#xff08;固有尺寸&#xff09;示例代码&#xff1a;图像的固有尺寸 2. 设置具体的尺寸示例代码&#xff1a;设置固定宽度和高度 3. 使用百分比示例代码&#xff1a;使用百分比设置宽度 4. 使用百分比作为外边距和内边距示例代码&a…...

Hive存储系统全面测试报告

引言 在大数据时代&#xff0c;数据存储和处理技术的重要性日益凸显。Apache Hive作为一个基于Hadoop的数据仓库工具&#xff0c;因其能够提供类SQL查询功能&#xff08;HiveQL&#xff09;而广受欢迎。Hive的设计初衷是为了简化大数据集的查询和管理&#xff0c;它允许用户通…...

minimind - 从零开始训练小型语言模型

大语言模型&#xff08;LLM&#xff09;领域&#xff0c;如 GPT、LLaMA、GLM 等&#xff0c;虽然它们效果惊艳&#xff0c; 但动辄10 Bilion庞大的模型参数个人设备显存远不够训练&#xff0c;甚至推理困难。 几乎所有人都不会只满足于用Lora等方案fine-tuing大模型学会一些新的…...

前端知识速记—JS篇:箭头函数

前端知识速记—JS篇&#xff1a;箭头函数 什么是箭头函数&#xff1f; 箭头函数是 ES6 引入的一种新的函数书写方式&#xff0c;其语法更为简洁&#xff0c;常用于替代传统的函数表达式。箭头函数的基本语法如下&#xff1a; const functionName (parameters) > {// 函数…...

小程序的协同工作与发布

1.小程序API的三大分类 2.小程序管理的概念&#xff0c;以及成员管理两个方面 3.开发者权限说明以及如何维护项目成员 4.小程序版本...

计算机网络 笔记 网络层 3

IPv6 IPv6 是互联网协议第 6 版&#xff08;Internet Protocol Version 6&#xff09;的缩写&#xff0c;它是下一代互联网协议&#xff0c;旨在解决 IPv4 面临的一些问题&#xff0c;以下是关于 IPv6 的详细介绍&#xff1a; 产生背景&#xff1a; 随着互联网的迅速发展&…...

python 语音识别

目录 一、语音识别 二、代码实践 2.1 使用vosk三方库 2.2 使用SpeechRecognition 2.3 使用Whisper 一、语音识别 今天识别了别人做的这个app,觉得虽然是个日记app 但是用来学英语也挺好的,能进行语音识别,然后矫正语法,自己说的时候 ,实在不知道怎么说可以先乱说,然…...

事务02之锁机制

锁机制 文章目录 锁机制一&#xff1a;MySQL锁的由来与分类1&#xff1a;锁机制的分类 二&#xff1a;共享锁与排他锁1&#xff1a;共享锁(S锁)2&#xff1a;排他锁(X锁)3&#xff1a;锁的释放 二&#xff1a;表级别锁1&#xff1a;元数据锁(了解)2&#xff1a;意向锁3&#xf…...