蓝桥杯 - 大石头的搬运工 C++ 前缀和 算法 附Java python

news2024/12/23 13:20:14

题目

思路和解题方法

这段代码的目标是计算给定点集的最小总移动成本,使得所有点都在同一直线上。它通过计算每个点左边和右边的移动成本,然后在所有可能的分割点中选择最小成本。具体步骤如下:

  1. 读取输入的点集,每个点表示为 (y, x),其中 y 是点的权重,x 是点的位置。
  2. 对点集按照 x 坐标进行排序。
  3. 计算每个点左边和右边的移动成本。
  4. 遍历每个可能的分割点,计算总成本,并记录最小成本。
  5. 输出最小成本。

复杂度

        时间复杂度:O(nlogn)

                

时间复杂度: 排序所需的时间复杂度为 O(nlogn),计算移动成本的过程需要线性时间,因此总体时间复杂度为 O(nlogn)。

        空间复杂度:O(n)

空间复杂度: 程序的空间复杂度主要取决于数组 p[]pre[]nex[] 和其他常量,因此为 O(n)。

c++ 代码

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+9;
#define x first
#define y second
typedef long long ll;
pair<int,int>p[N];
ll pre[N],nex[N];
int main() {
    int n;
    cin>>n;
    // 读入点集,每个点的坐标为 (y, x)
    for(int i=1;i<=n;i++)
        cin>>p[i].y>>p[i].x;
    // 按照 x 坐标对点集进行排序
    sort(p+1,p+1+n);
    ll s=0;
    // 计算每个点左边的移动成本
    for(int i=1;i<=n;i++){
        pre[i]=pre[i-1];
        pre[i]+=s*(p[i].x-p[i-1].x);
        s+=p[i].y;
    }
    s=0;
    // 计算每个点右边的移动成本
    for(int i=n;i>=1;i--){
        nex[i]=nex[i+1];
        nex[i]+=s*(p[i+1].x-p[i].x);
        s+=p[i].y;
    }
    ll ans=1e18;
    // 遍历每个可能的分割点,计算总成本,并记录最小成本
    for(int i=1;i<=n;i++){
        ans=min(ans,pre[i]+nex[i]);
    }
    // 输出最小成本
    cout<<ans<<endl;
    return 0;
}

Java 版本(仅供参考)

import java.util.*;

public class Main {
    static final int N = 100009;

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        Pair[] p = new Pair[N];
        long[] pre = new long[N];
        long[] nex = new long[N];

        for (int i = 1; i <= n; i++)
            p[i] = new Pair(scanner.nextInt(), scanner.nextInt());

        Arrays.sort(p, 1, n + 1);

        long s = 0;
        for (int i = 1; i <= n; i++) {
            pre[i] = pre[i - 1];
            pre[i] += s * (p[i].x - p[i - 1].x);
            s += p[i].y;
        }
        s = 0;
        for (int i = n; i >= 1; i--) {
            nex[i] = nex[i + 1];
            nex[i] += s * (p[i + 1].x - p[i].x);
            s += p[i].y;
        }

        long ans = Long.MAX_VALUE;
        for (int i = 1; i <= n; i++) {
            ans = Math.min(ans, pre[i] + nex[i]);
        }

        System.out.println(ans);
    }

    static class Pair implements Comparable<Pair> {
        int y, x;

        Pair(int y, int x) {
            this.y = y;
            this.x = x;
        }

        public int compareTo(Pair other) {
            return Integer.compare(this.x, other.x);
        }
    }
}

Python 版本(仅供参考)

n = int(input())
p = [(0, 0)] * (n + 1)
pre = [0] * (n + 1)
nex = [0] * (n + 1)

for i in range(1, n + 1):
    p[i] = tuple(map(int, input().split()))

p.sort(key=lambda x: x[1])

s = 0
for i in range(1, n + 1):
    pre[i] = pre[i - 1]
    pre[i] += s * (p[i][1] - p[i - 1][1])
    s += p[i][0]

s = 0
for i in range(n, 0, -1):
    nex[i] = nex[i + 1]
    nex[i] += s * (p[i + 1][1] - p[i][1])
    s += p[i][0]

ans = float('inf')
for i in range(1, n + 1):
    ans = min(ans, pre[i] + nex[i])

print(ans)

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C/C++ 树中王牌:红黑树的结构及实现

一、红黑树的定义 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路 径会比其他路径长出俩倍&#xff…

2024大广赛Canva可画都有哪些命题?

大广赛官网在3月8日发布了2024年Canva可画的命题&#xff0c;Canva可画是全球领先的视觉传播平台&#xff0c;2013年诞生于悉尼&#xff0c;2018年进入中国市场。秉承“赋予世界设计的力量”的使命&#xff0c;Canva可画为用户提供零门槛的设计编辑工具(网页端/App/小程序)&…

element-plus 完成下拉切换功能

项目场景&#xff1a; element-plus element-plus 完成下拉切换功能&#xff0c;选用了popover 组件去进行样式修改&#xff0c;本来大概是要实现下面这样的样式效果&#xff0c;没想到调整的时候&#xff0c;这个选择的高亮模块总是超出。 实现效果&#xff1a; 解决方案&am…

Linux/Cap

Enumeration nmap 第一次扫描发现系统对外开放了21&#xff0c;22&#xff0c;80端口&#xff0c;端口详细信息如下 除了22的ssh服务&#xff0c;80的http服务&#xff0c;还开了21端口&#xff0c;运行着ftp服务&#xff0c;从nmap给出的结果可以看到并没有启用匿名登录设置…

【力扣 - 找到字符串中所有字母异位词】

题目描述 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串&#xff08;包括相同的字符串&#xff09;。 示例 1: 输入: s "cbaebabacd"…

能查看二十四节气并提醒的软件是什么 二十四节气提醒软件

阳光斜照&#xff0c;我站在窗前&#xff0c;感受着四季的变迁。每个季节都有它独特的韵味&#xff0c;而二十四节气&#xff0c;便是这四季变换的细腻注脚。它们不仅是大自然的节奏&#xff0c;更与农事、生活紧密相连&#xff0c;承载着古人的智慧和对自然的敬畏。 小时候&a…

linux 新增定时任务

1、创建定时任务 crontab -e 2、加入定时任务规则 0 2 * * * /usr1/local/mysql-backup/backup.sh 说明&#xff1a;backup.sh是sh脚本 3、重启定时任务 service crond restart 扩展 1、查看定时任务列表 crontab -l 2、需要修改定时任务 crontab -e

第十八届全国大学生智能汽车竞赛——摄像头算法(附带个人经验)

文章目录 前言一、摄像头图像处理1、摄像头图像采集2、图像二值化与大津算法 二、左右边界&#xff0c;中线扫描 前言 参加了第十六&#xff0c;十七和第十八届全国大学生智能车竞赛&#xff0c;对摄像头的学习有部分心得&#xff0c;分享给大家&#xff0c;三届车赛&#xff…

explain关键字的用法(mysql高级部分)

文章目录 简介explain关键字分析 简介 explain主要是用来分析sql语句的&#xff0c;当你的系统中出现慢查询SQL后&#xff0c;你可以使用explain关键字对该语句进行分析。通过使用explain&#xff0c;我们可以得到以下结果 表的读取顺序 哪些索引可能使用 哪些索引被实际使用…

有c语言基础,如何快速学会C++核心知识?

有c语言基础&#xff0c;如何快速学会C核心知识&#xff1f; 在开始前我分享下我的经历&#xff0c;我刚入行时遇到一个好公司和师父&#xff0c;给了我机会&#xff0c;一年时间从3k薪资涨到18k的&#xff0c; 我师父给了一些 电气工程师学习方法和资料&#xff0c;让我不断提…

9:00面试,9:06就出来了,问的实在是太变态了

我从一家小公司转投到另一家公司&#xff0c;期待着新的工作环境和机会。然而&#xff0c;新公司的加班文化让我有些始料未及。虽然薪资相对较高&#xff0c;但长时间的工作和缺乏休息使我身心俱疲。 就在我逐渐适应这种高强度的工作节奏时&#xff0c;公司突然宣布了一则令人…

力扣● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和 动态规划

● 1143.最长公共子序列 1.dp数组含义。 dp[i][j]&#xff1a;数组1[0,i-1]范围的子数组和数组2[0,j-1]的子数组的公共子序列最长长度。注意这里不需要一定以A[i-1]/B[j-1]结尾&#xff0c;原因在下面有说明。 动态规划求子序列的问题&#xff0c;一般都是dp的下标相对于数组…

系统运维网络知识汇总

一、系统运维中网络方面的规划与思考 系统运维建立在网络的基础之上&#xff0c;如果没有一个相对合理的网络架构&#xff0c;恐怕系统运维做起来也不是那么的顺手。一个公司基本上都会把网络和服务器独立开来&#xff0c;划分不同的区域摆放设备&#xff0c;很多时候都是物理…

YOLOv8_seg-Openvino和ONNXRuntime推理【CPU】

纯检测系列&#xff1a; YOLOv5-Openvino和ONNXRuntime推理【CPU】 YOLOv6-Openvino和ONNXRuntime推理【CPU】 YOLOv8-Openvino和ONNXRuntime推理【CPU】 YOLOv7-Openvino和ONNXRuntime推理【CPU】 YOLOv9-Openvino和ONNXRuntime推理【CPU】 跟踪系列&#xff1a; YOLOv5/6/7-O…

力扣L5----- 58. 最后一个单词的长度(2024年3月11日)

1.题目 2.知识点 注1&#xff1a; lastIndexOf()它用于查找指定字符或子字符串在当前字符串中最后一次出现的位置。它的作用是从字符串的末尾向前搜索指定字符或子字符串&#xff0c;并返回其最后一次出现的位置的索引。 &#xff08;1&#xff09;例如&#xff0c;在字符串 …

银河麒麟V10SP3操作系统-网络时间配置

1、动态网络配置 打开终端&#xff0c;以网口 eth0 为例&#xff1a; nmcli conn add connection.id eth0-dhcp type ether ifname eth0 ipv4.method auto其中“eth0-dhcp”为连接的名字&#xff0c;可以根据自己的需要命名方便记忆和操作 的名字&#xff1b;“ifname eth0”…

鞋服品牌如何计算门店盈亏平衡?

在鞋服品牌的运营中&#xff0c;门店盈亏平衡是衡量门店经营效果的重要指标。盈亏平衡点意味着门店在达到这一销售水平时&#xff0c;既能够覆盖所有固定和变动成本&#xff0c;又能实现零利润或零亏损。计算门店盈亏平衡有助于品牌更好地理解门店的经营状况&#xff0c;制定合…

Springboot进行web开发

创建springboot工程&#xff0c;基于2022版idea pom.xml文件中的插件爆红&#xff1a; 解决方法&#xff1a;给插件加<version>版本号</version> 版本号和<parent></parent>中的版本号一样。 另外有人说重启也可以解决爆红&#xff0c;可以试一下&a…

SpringBoot(容器功能)

文章目录 1.Configuration 添加/注入bean1.注入bean1.编写一个JavaBean&#xff0c;Monster.java2.创建一个config文件夹&#xff08;名字任意&#xff09;&#xff0c;用于存放配置Bean的类&#xff08;相当于配置文件&#xff09;3.BeanConfig.java4.测试使用 MainApp.java2.…

高中信息技术教资学习

一、几种排序方法的基本思想 1、直接插入排序&#xff08;假设按照从小到大进行排序&#xff09; 默认第一个元素是有序的&#xff0c;从有序的元素末尾开始&#xff0c;与要插入的元素进行比较&#xff0c;如果要插入的元素比有序的末尾元素小的话&#xff0c;就将有序末尾元…