《算法竞赛·快冲300题》每日一题:“推箱子”

news2024/11/26 14:48:02

算法竞赛·快冲300题》将于2024年出版,是《算法竞赛》的辅助练习册。
所有题目放在自建的OJ New Online Judge。
用C/C++、Java、Python三种语言给出代码,以中低档题为主,适合入门、进阶。

文章目录

  • 题目描述
  • 题解
  • C++代码
  • Java代码
  • Python代码

推箱子” ,链接: http://oj.ecustacm.cn/problem.php?id=1819

题目描述


【题目描述】 在一个高度为H的箱子前方,有一个长和高为N的障碍物。
  障碍物的每一列存在一个连续的缺口,第i列的缺口从第l个单位到第h个单位(从底部由0开始数)。
  现在请你清理出一条高度为H的通道,使得箱子可以直接推出去。
  请输出最少需要清理的障碍物面积。
  如下图为样例中的障碍物,长和高度均为5,箱子高度为2。不需要考虑箱子会掉入某些坑中。最少需要移除两个单位的障碍物可以造出一条高度为2的通道。
在这里插入图片描述

【输入格式】 输入第一行为两个正整数N和H,表示障碍物的尺寸和箱子的高度,1≤H≤N≤1000000。
  接下来N行,每行包含两个整数li和hi,表示第i列缺口的范围,0≤li≤hi<N。
【输出格式】 输出一个数字表示答案。
【输入样例】

5 2
2 3
1 2
2 3
1 2
2 3

【输出样例】

2

题解

  箱子高度为H,检查障碍物中的连续H行,看哪H行需要清理的障碍物最少,或者哪H行中的空白最多。在输入样例中,障碍物共5行,这5行中的空白数量从底部开始往上数分别是(0, 2, 5, 3, 0),其中(5, 3)这2行的空白最多,是5+3=8,需要移除的障碍物数量是N×H-8=5×2-8=2。
  用数组a[]表示障碍物,a[i]是障碍物第i行的空白数量。把题目抽象为:a[]是N个整数,从a[]中找出连续的H个整数,要求它们的和最大。
  先考虑用暴力法求解。
  (1)如果用暴力法从左到右依次对a[]中的H个整数求和,找到最大的和,总计算量是O(NH)的,超时。
  (2)也需要注意输入的问题。题目按列给出空白数量,需要转换为行的空白数量。如果简单地转换,计算量太大。例如样例第1列的空白位置是(2, 3),需要赋值a[2]++、a[3]++。一列有H个空白,a[]数组需要赋值H次,N列的总计算量是O(NH),超时。
  本题用差分和前缀和来优化。
  (1)用差分处理输入。下面代码第9行读一个列的起点位置li和终点位置hi,代码第10行和第11行输入到d[],d[]是a[]的差分。计算量仅为O(N)。
  (2)用前缀和求区间和。第14行用d[]求a[];第16行计算a[]的前缀和sum[];第18、19行找到最大的区间和。计算量仅为O(N)。。
【笔记】 通过本题熟悉差分和前缀和的应用 。

C++代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
ll d[N], a[N], sum[N];
int main(){
    int n, h;   scanf("%d%d",&n,&h);
    for(int i = 1; i <= n; i++) {
        int li, hi;     scanf("%d%d",&li,&hi);       //本题n≤1000000,用scanf输入比cin快
        d[li]++;                                             //可替换为  sum[li]++;
        d[hi+1]--;                                           //可替换为  sum[hi+1]--;
    }
    //用差分数组计算原数组
    for(int i = 1; i <= n; i++)  a[i] = a[i-1] + d[i-1];     //可替换为  sum[i] += sum[i-1];
    //用原数组计算前缀和数组
    for(int i = 1; i <= n; i++)  sum[i] = sum[i-1] + a[i];   //可替换为  sum[i] += sum[i-1];
    ll ans = sum[h-1];
    for(int left = 1; left+h-1 <= n; left++)
        ans = max(ans, sum[left+h-1] - sum[left-1]);
    cout << (ll)n * h - ans << endl;
    return 0;
}

Java代码

import java.util.*;
import java.io.*;
public class Main{
    static int N = 1_000_010;
    static long[] d = new long[N], a = new long[N], sum = new long[N];
    public static void main(String[] args) throws Exception{
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt(), h = scan.nextInt();
        for(int i = 1; i <= n; i++) {
            int li = scan.nextInt(), hi = scan.nextInt();
            d[li]++;
            d[hi+1]--;
        }
        for(int i = 1; i <= n; i++)  a[i] = a[i-1] + d[i-1];   //用差分数组计算原数组
        for(int i = 1; i <= n; i++)  sum[i] = sum[i-1] + a[i]; //用原数组计算前缀和数组
        long ans = sum[h-1];
        for(int left = 1; left+h-1 <= n; left++)
            ans = Math.max(ans, sum[left+h-1] - sum[left-1]);
        System.out.println((long)n * h - ans);
    }
}

Python代码

import sys
input=sys.stdin.readline                       #加这句后读入会快些
n, h = map(int, input().split())
d, a, sum = [0] * (n+10), [0] * (n+10), [0] * (n+10)
for i in range(1, n+1):
    li, hi = map(int, input().split())
    d[li] += 1
    d[hi+1] -= 1
for i in range(1, n+1):  a[i] = a[i-1] + d[i-1]     #用差分数组计算原数组
for i in range(1, n+1):  sum[i] = sum[i-1] + a[i]   #用原数组计算前缀和数组
ans = sum[h-1]
for left in range(1, n-h+2):  ans = max(ans, sum[left+h-1] - sum[left-1])
print(n * h - ans)

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

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

相关文章

1 考试宝自建题库使用说明

注意&#xff1a; 标准格式&#xff1a;括号里不写对象&#xff0c;然后答案行数另取一行&#xff0c;放在选项后一行也是可以的&#xff0c;选项可以横排或者竖排。横排的话选项要用空格隔开&#xff0c;选项的ABCD要加"."&#xff0c;如A. B. C. D. 1. 法治中国…

多个电源模块带电感,给一个负载用的直流压降仿真-CORE电源

多个电源模块带电感,给一个负载用的直流压降仿真-CORE电源 下面介绍如何对多个电源模块带电感,给一个负载用的直流压降仿真,常见于CPU的CORE电源。以下图为例 具体操作步骤如下 设置VRAM(因为是多个电源输出,所以每个电源都要设置成VRAM)

【C语言】轻松模拟实现qsort函数

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;我们今天接着上回更新的内容&#xff0c;讲讲我们如何模拟实现自己的qsort函数&#xff0c; 废话不多说&#xff0c;我们开始今天的内容。 模拟实现qsort函数 qsort函…

文心一言 VS 讯飞星火 VS chatgpt (59)-- 算法导论6.4 3题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;59&#xff09;-- 算法导论6.4 3题 三、对于一个按升序排列的包含 n 个元素的有序数组 A 来说&#xff0c;HEAPSORT 的时间复杂度是多少?如果 A 是降序呢? 文心一言&#xff1a; 对于一个按升序排列的包含 n 个元素的有序数组…

ModaHub魔搭社区:AI原生云向量数据库Weaviate 对比 Milvus

通过以下一系列能力比较 Weaviate 对比 Milvus。我们希望您选择适合您的最佳开源数据库,即使它不是我们。 Weaviate 与 Milvus 可扩展性对比 Weaviate Milvus 计算存储分离 ❌ ✔️ 支持 10 亿级向量数据 ❌ ✔️ 云原生 ✔️ ✔️ 多副本 ✔️ ✔️ 查询插入分离

第一次用用Opencv进行图像处理

2023.7.06更新 codeblocks安装opencv 直接放参考链接&#xff0c;完成安装该步骤来&#xff0c;简单高效&#xff01; 安装教程链接 有一个问题就是第一次安装完成后运行时会报确实某些ddl的错误&#xff0c;关机重启就好啦&#xff01; 尝试运行 ddl的错误解决后可以用以…

用Python采用Modbus-Tcp的方式读取PLC模块数据

使用计算器得到需要的寄存器地址 这里PLC地址是83,对应的程序16进制读取地址是53 实际上由于PLC地址从1开始&#xff0c;所以这里实际地址应该是52&#xff0c;因为计算机从0开始 使用网络调试助手生成报文 使用Python中的内置函数int()。以下是将人员卡号’b’3b44’转换为十…

mac批量提取文件夹的名称,怎么操作?

mac批量提取文件夹的名称&#xff0c;怎么操作&#xff1f;很多小伙伴想知道在mac电脑上可以一键快速批量的将大量文件夹的名提取出来&#xff0c;而不是采用一个一个名称提取的方法&#xff0c;这是一个有利于提高工作效率的办法&#xff0c;这一项技能在网上几乎找不到解决办…

智能感测型静电消除器的原理

感测型静电消除器是一种能够监测和消除静电的装置。静电是由于物体表面积聚了不平衡的电荷而产生的现象&#xff0c;常常会引发电击、火花、物体吸附等问题。 感测型静电消除器通常包含以下几个主要部分&#xff1a; 1. 传感器&#xff1a;用于检测静电电荷的存在和强度。传感…

V4l2-ctl

1 v4l-utils v4l-utils是一种用于处理媒体设备的软件包&#xff0c;它主要包含两个常用工具1&#xff1a; media-ctl&#xff1a;用于配置拓扑结构中各节点的format、大小、链接&#xff1b;操作/dev/medio0节点&#xff1b;获取Camera支持数据格式等。v4l2-ctl&#xff1a;用…

Java面试为啥会越来越难?

最近感慨面试难的人越来越多了&#xff0c;一方面是市场环境&#xff0c;更重要的一方面是企业对Java的人才要求越来越高了。 基本上这样感慨的分为两类人&#xff0c;第一&#xff0c;虽然挂着3、5年经验&#xff0c;但肚子里货少&#xff0c;也没啥拿得出手的项目&#xff0c…

追妹神器,恋爱神器,哄老婆开心,智能机器人每天给你心爱的TA发送早晚安问候

柠檬恋爱助理配置文档 柠檬恋爱助理插件是利用微信测试公众号&#xff0c;实现每天给你的TA发送早晚安等模板消息的一款全自动化插件&#xff0c;恋爱神器、追妹神器。真正做到只需简单配置&#xff0c;就可以实现哄你的TA开心快乐每一天。 项目地址&#xff1a;点击查看 体…

【C语言】-- 一篇带你了解指针数组与数组指针

目录 一、什么是指针数组和数组指针 1. 指针数组&#xff1a;顾名思义&#xff0c;存放指针的数组。 补充&#xff08;1&#xff09;&#xff1a;指针数组还可以和字符串数组相结合使用 补充&#xff08;2&#xff09;&#xff1a;二维数组与指针数组的区别 2. 数组指针&am…

UriComponentsBuilder使用发现参数被编码了

前言 开发中&#xff0c;小编在项目中&#xff0c;使用RestTemplate做GET请求&#xff0c;为了优雅的封装参数&#xff0c;使用了UriComponentsBuilder来进行参数封装。直接123将代码写完&#xff0c;远程调用有数据&#xff0c;远程底层solr库&#xff0c;所以拿到数据了&…

Linux的基本使用和web程序部署

注意&#xff1a;本文章不适合C学习者&#xff08;知识点远远不够&#xff09;&#xff0c;只适合Java学习者&#xff0c;学习简单的Linux命令 1.Linux的背景知识 1.1Linux是什么 Linux是一个操作系统&#xff0c;和Windows是“并列”的关系。经过多年的发展&#xff0c;Lin…

控制台警告:Added non-passive event listener to a scroll-blocking <some> event

页面中的echarts图表缩放后在控制台就会出现以下提醒&#xff0c;虽然只是报黄提醒&#xff0c;但本人强迫症严重,见不得控制台有任何异常...... [Violation] Added non-passive event listener to a scroll-blocking <some> event. Consider marking event handler as …

python+pytest接口自动化之测试函数、测试类/测试方法的封装

目录 前言 测试用例封装的一般规则 测试函数的封装 测试类/方法的封装 示例代码 总结 前言 在pythonpytest 接口自动化系列中&#xff0c;我们之前的文章基本都没有将代码进行封装&#xff0c;但实际编写自动化测试脚本中&#xff0c;我们都需要将测试代码进行封装&#…

并不简单的代理,Dubbo是如何做服务引用的

系列文章目录 【收藏向】从用法到源码&#xff0c;一篇文章让你精通Dubbo的SPI机制 面试Dubbo &#xff0c;却问我和Springcloud有什么区别&#xff1f; 超简单&#xff0c;手把手教你搭建Dubbo工程&#xff08;内附源码&#xff09; Dubbo最核心功能——服务暴露的配置、使用…

2023/07/14 UML图/流程图/泳道图是什么

UML图 UML图中的几种图简介&#xff08;时序图&#xff0c;协作图&#xff0c;状态图&#xff0c;活动图&#xff0c;对象图&#xff09; 泳道图 适合做这种效果&#xff0c;体现角色关系 流程图 定义 绘制要素 开始/结束&#xff1a;用一个椭圆标识&#xff0c;代表流畅的开…

优维EasyOps产品使用最佳实践:Agent存活性监控

优维EasyOps平台内置Agent存活性监控啦&#xff01; Agent作为自动化/监控底层核心组件&#xff0c;它的可用性直接影响了上层功能的使用&#xff0c;故我们会非常关注它的状态。但如果有网络波动、Agent升级或机器故障等都可能导致Agent异常&#xff0c;这时用户希望这种异常…