机试题——新能源汽车充电桩建设策略

news/2025/2/25 17:39:10

题目描述

随着新能源汽车的蓬勃发展,新能源汽车充电桩的覆盖密度越来越重要。某汽车公司建设充电桩的思路如下:

  • 一条高速沿线,每个区域建设一个充电站,充电站内有多个充电桩,充电站之间保持合理的距离。
  • 每个充电站可以覆盖相邻范围的多个区域。
  • 使用n表示充电站的数目,使用station[i]数组表示第i个充电站中充电桩的数目。
  • 给定一个范围r,表示每个充电站可以覆盖的相邻区域范围(|i - j| <= r0 <= i, j <= n - 1)。
  • 汽车公司打算在一些城市新增k个充电桩,如何分配这k个充电桩给充电站,使得所有区域中,被充电桩覆盖最少的区域的充电桩数目最大化。

输入描述

  1. 第一行:一个整数n,表示充电站的数目(0 <= n <= 100000)。
  2. 第二行:n个整数,表示每个充电站中充电桩的数目(0 <= station[i] <= 100000)。
  3. 第三行:一个整数r,表示充电站可覆盖的相邻区域范围(0 <= r <= n - 1)。
  4. 第四行:一个整数k,表示需要新增的充电桩数目(0 <= k <= 1000000000)。

输出描述

一个整数,表示被充电桩覆盖最少的区域的充电桩数目。

用例输入

5
1 2 4 5 0
1
2
5

最优方案是把2个充电桩都放在充电站1,这样每个充电站的充电桩数目分别为1 4 4 5 0
区域0的覆盖充电桩为1 + 4 = 5,区域1为1 + 4 + 4 = 9,区域2为4 + 4 + 5 = 13,区域3为5 + 4 = 9,区域4为5 + 0 = 5
充电桩覆盖数目最少是5,无法得到更优解,因此返回5

4
4 4 4 4
0
2
4

无论怎么分配新增的3个充电桩,总有一个区域的充电桩覆盖数目是4

解题思路

  1. 问题建模

    • 该问题可以看作是一个二分查找问题,目标是最大化所有区域中覆盖最少的充电桩数目。
    • 使用差分数组预处理每个区域的充电桩覆盖情况,然后通过二分查找确定最优的覆盖数目。
  2. 差分数组预处理

    • 使用差分数组dk来预处理每个区域的充电桩覆盖情况,减少计算复杂度。
    • 对于每个充电站i,更新差分数组dk,使得dk[i - r] += station[i]dk[i + r + 1] -= station[i]
  3. 二分查找

    • 使用二分查找确定最优的覆盖数目target
    • 对于每个target,检查是否可以通过分配k个充电桩使得所有区域的覆盖数目都达到target
    • 如果可以,则尝试更大的target;否则,尝试更小的target
  4. 贪心分配

    • 在检查过程中,如果某个区域的覆盖数目不足target,则分配足够的充电桩,并更新差分数组。尽可能的往右边覆盖,也就是min(n, i + 2 * r+1)

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<algorithm>
#include<string>
#include<vector>
#include<unordered_map>
#include<unordered_set>
#include<queue>
#include<set>
#include<list>
#include<sstream>
#include<bitset>
#include<stack>
#include<climits>
using namespace std;

int n, r, k;

bool check(vector<long long> dk, long long target) {
    long long tk = k; // 剩余可分配的充电桩
    long long cur = 0; // 当前区域的覆盖充电桩数目
    for (int i = 0; i < n; i++) {
        cur += dk[i]; // 更新当前区域的覆盖充电桩数目
        if (cur < target) { // 如果当前区域不足target
            tk -= (target - cur); // 分配充电桩
            dk[min(n, i + 2 * r + 1)] -= (target - cur); // 更新差分数组
            cur = target; // 当前区域覆盖数目达到target
        }
    }
    return tk >= 0; // 如果分配完成,则返回true
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> n;
    vector<long long> station(n);
    for (int i = 0; i < n; i++) {
        cin >> station[i];
    }
    cin >> r >> k;

    // 差分数组预处理
    vector<long long> dk(n + 1, 0);
    for (int i = 0; i < n; i++) {
        dk[max(0, i - r)] += station[i];
        dk[min(n, i + r + 1)] -= station[i];
    }

    // 二分查找最优解
    long long l = 0, r = 2e10;
    long long res = 0;
    while (l <= r) {
        long long mid = (l + r) / 2;
        if (check(dk, mid)) {
            l = mid + 1;
            res = mid;
        } else {
            r = mid - 1;
        }
    }
    cout << res;
    return 0;
}

http://www.niftyadmin.cn/n/5865775.html

相关文章

C#开发——ConcurrentDictionary集合

ConcurrentDictionary<TKey, TValue> 是 C# 中一个专为多线程场景设计的线程安全字典集合&#xff0c;位于 System.Collections.Concurrent 命名空间中。它允许多个线程同时对字典进行读写操作&#xff0c;而无需额外的同步措施。 一、集合特征 此集合有如下特征…

LabVIEW新能源客车CAN监控软件

LabVIEW平台开发的新能源客车监控软件&#xff0c;提高客车下线调试及售后服务的效率和质量。该软件通过实时数据监控和故障诊断功能&#xff0c;为技术人员提供了强大的数据支持&#xff0c;使得车辆问题可以迅速被识别和解决。 ​ 项目背景 随着新能源客车市场的快速发展&a…

《Keras 3 :使用 Vision Transformers 进行物体检测》:此文为AI自动翻译

《Keras 3 :使用 Vision Transformers 进行物体检测》 作者:Karan V. Dave 创建日期:2022 年 3 月 27 日最后修改时间:2023 年 11 月 20 日描述:使用 Vision Transformer 进行对象检测的简单 Keras 实现。 (i) 此示例使用 Keras 3 在 Colab 中查看 GitHub 源 介绍 A…

Helix——Figure 02发布的通用人形机器人控制VLA:不用微调即可做多个任务的快与慢双系统,让两个机器人协作干活(含清华HiRT详解)

前言 过去一周&#xff0c;我花了很大的心思、力气&#xff0c;把deepseek的GRPO、MLA算法的代码解析通透&#xff0c;比如GRPO与PPO的详细对比&#xff0c;再比如MLA中&#xff0c;图片 公式 代码的一一对应&#xff0c;详见此专栏《火爆全球的DeepSeek系列模型》 2.20日晚&…

11_17日项目笔记——制作“全屏播放页面”

创建项目&#xff1a; 项目需求&#xff1a;要实现的页面效果 使用相对布局&#xff08;Relative&#xff09;&#xff1a; 所需图片资源需要请点击我https://download.csdn.net/download/m0_73992525/90009094?spm1001.2014.3001.5503 修改默认启动页面 此时应用启动默认加载…

go:运行第一个go语言程序

1.如何创建go语言编辑界面 2.案例一实现简单打印“hello worlg”: package main import "fmt" func main() { for i : 0; i < 10; { if i < 0 { continue } fmt.Println("hello world") i } } 运行结果&#xff1a; PS D:\demo2> go mod ini…

DeepSeek 助力 Vue 开发:打造丝滑的滚动动画(Scroll Animations)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

elementUI方案汇总

1&#xff1a;el-table 设置固定列&#xff0c;横向滚动条在固定列的位置上无法滚动的问题 问题原因&#xff1a;固定列将下方的滚动条盖住了&#xff0c;无法触发滚动条的滚动。 解决方法&#xff1a;改变固定列的样式&#xff0c;给固定列设置下边距&#xff0c;下边距的大小…