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

蓝桥杯备赛-差分-推箱子

在一个高度为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

 通过率90%
障碍物高度为n,前缀和数组a和差分数组大小为n+1
前缀和ai表示第i行有几个空位置
依次读取每次的缺口,在差分数组上做标记,在利用数组之间的关系,更新前缀和数组
更新完,就从最底的一行开始遍历每一行障碍物,每次遍历计算h行的非空数+(h-a[i])即可

#include<stdio.h>
#include<iostream>
#include<vector>
#include<climits>
using namespace std;
int main()
{
	long long n, h;
	cin >> n >> h;
	vector<long long> a(n + 2, 0);//前缀和数组
	vector<long long> d(n + 2, 0);//差分数组
	long long l, r;
	for (int i = 1; i <= n; i++) {
		cin >> l >> r;
		d[l + 1]++;
		d[r + 2]--;
	}
	for (int i = 1; i <= n; i++) {
		a[i] = a[i - 1] + d[i];
	}
	long long min = LLONG_MAX;
	for (int i = 1; i <= n - h + 1; i++) {
		long long count = 0;
		for (int j = 0; j < h; j++) {
			count += (n - a[i + j]);
		}
		if (count < min) {
			min = count;
		}
	}
	cout << min;
	return 0;
}

 


http://www.kler.cn/a/579828.html

相关文章:

  • 拒绝“浅尝辄止”让考研知识深入人心
  • 010---基于Verilog HDL的分频器设计
  • 《 C++ 点滴漫谈: 三十 》函数参数
  • PyTorch基础语法万字解析
  • 开源将图像和 PDF 文件高精度地转换为 Markdown 和 JSON 格式的文本软件
  • 【一文学会 HTML5】
  • 系统架构设计师—系统架构设计篇—软件架构风格
  • Docker—Docker环境安装部署
  • 第N5周:Pytorch文本分类入门
  • 题解:AT_arc093_b [ABC092D] Grid Components
  • 从HashMap到ConcurrentHashMap源码详解
  • Python Flask 和数据库系统交互
  • 蓝耘携手通义万相2.1:引领AI创作革新,重塑视觉体验
  • 非软件开发项目快速上手:14款管理软件精选
  • REST API前端请求和后端接收
  • Floyd求解最短路径问题
  • 洛谷 P3884 [JLOI2009] 二叉树问题
  • 力扣热题 100:图论专题经典题解析
  • 刷题统计 | 第十三届蓝桥杯省赛C++B组
  • 2019年蓝桥杯第十届CC++大学B组真题及代码