首页 > 其他分享 >P1969 [NOIP2013 提高组] 积木大赛

P1969 [NOIP2013 提高组] 积木大赛

时间:2024-05-01 12:33:05浏览次数:17  
标签:le NOIP2013 积木 差分 P1969 数组 区间 操作

P1969 [NOIP2013 提高组] 积木大赛

题目

春春幼儿园举办了一年一度的“积木大赛”。今年比赛的内容是搭建一座宽度为 \(n\) 的大厦,大厦可以看成由 \(n\) 块宽度为 \(1\) 的积木组成,第 \(i\) 块积木的最终高度需要是 \(h_i\)。

在搭建开始之前,没有任何积木(可以看成 \(n\) 块高度为 \(0\) 的积木)。接下来每次操作,小朋友们可以选择一段连续区间 \([l, r]\),然后将第 \(L\) 块到第 \(R\) 块之间(含第 \(L\) 块和第 \(R\) 块)所有积木的高度分别增加 \(1\)。

小 M 是个聪明的小朋友,她很快想出了建造大厦的最佳策略,使得建造所需的操作次数最少。但她不是一个勤于动手的孩子,所以想请你帮忙实现这个策略,并求出最少的操作次数。

输入

包含两行,第一行包含一个整数 \(n\),表示大厦的宽度。

第二行包含 \(n\) 个整数,第 \(i\) 个整数为 \(h_i\)。

输出

建造所需的最少操作数。

样例

输入

5
2 3 4 1 2

输出

5

提示

样例解释

其中一种可行的最佳方案,依次选择:\([1,5]\),$ [1,3]\(,\)[2,3]\(,\)[3,3]\(,\) [5,5]$。

数据范围

  • 对于 \(30\%\) 的数据,有 \(1 \le n \le 10\);
  • 对于 \(70\%\) 的数据,有 \(1 \le n \le 1000\);
  • 对于 \(100\%\) 的数据,有 \(1 \le n \le 100000\),\(0 \le h_i \le 10000\)。

思路

通过思考分析,可以将对区间整体积木增加高度 \(1\) 的操作改为对最终高度的积木做区间减 \(1\) 的操作,这将意味着所有的操作都是对区间进行减法操作。为了降低区间修改的时间复杂度,将题目中最终积木高度的数组转换成差分数组。例如:将“\(2,3,4,1,2\)”原数组转换为差分数组“\(2,1,1,-3,1\)”。由于原数组通过变换后最终所有数字都相同且都为 \(0\),此时对应的差分数组也都为 \(0\)。由于对原数组的区间 \(\lbrack L,R ]rbrack\) 的减 \(1\) 操作是对差分数组区间 \(\lbrack L,R + 1 \rbrack\) 操作,使得原数组最终变成 \(0\)。其中有几个细节问题,如:

  1. 对原数组区间 \(\lbrack 1,p \rbrack\) 进行“\(-k\)”操作,对应差分数组是对 \(1\),\(p+1\) 位置数字进行“\(-k,+k\)”操作。

  2. 对原数组区间 \(\lbrack p,n \rbrack\) 进行“\(-k\)”操作,对应差分数组是对 \(p\) 位置数字进行“\(-k\)”操作,由于 \(n+1\) 已经超出数组范围,因此对 \(n+1\) 位置的数是否做计算对最终的结果无影响。

为了使原数组变为 \(0\),差分数组也变成 \(0\),求最少操作,可以执行成对的“\(-1,+1\)”操作,
差分数组进行“\(-1,+1\)”操作后,最终变成所有数字均不小于 \(0\)。例如最后的差分数组假设为

位置 数值
1 2
2 0
3 0
4 1
5 0

可以两次对第 \(1\) 个位置的数字进行“\(-1\)”操作,对第 \(6\) 个位置的数字进行“\(+1\)”操作;一次对第 \(4\) 个位置的数字进行“\(-1\)”操作,对第 \(6\) 个位置的数进行“\(+1\)”操作。这样,便能用最少的操作次数使得差分数组中所有的数字变成 \(0\)。

思考,假如“\(-1,+1\)”操作成对进行后,差分数组仍有数值小于 \(0\),说明需要进一步通过“\(+1,-1\)”操作才能使差分数组所有数值最终为 \(0\)。然而“\(+1,-1\)”成对操作则意味着对原数组执行的是区间加法操作,这与题目分析中的第一点相矛盾。

综合可得,“\(-1,+1\)”成对操作的次数就是差分数组中正数之和。

代码

#include <bits/stdc++.h>

using namespace std;

int n, ans, a[100010], b[100010];

int main()
{
	scanf("%d", &n);
	for (int i = 1; i <= n; i ++ )
	{
		scanf("%d", &a[i]);
		b[i] = a[i] - a[i - 1];
	}
	for (int i = 1; i <= n; i ++ )
	{
		if (b[i] > 0)
			ans += b[i];
	}
	printf("%d", ans);
	return 0;
}

标签:le,NOIP2013,积木,差分,P1969,数组,区间,操作
From: https://www.cnblogs.com/IronMan-PZX/p/18169246

相关文章

  • 积木大赛
    转化成差分之后,差分数组里面正数的和一定不会小于负数的和的绝对值(因为\(h_i>0\)),所以答案的下界是正数的和我们来证明一定存在一种方案达到下界用数学归纳法。设差分数组为\(d\)显然\(d_1≥0\);也有\(d_1+d_2≥0\)(假设\(d_2\)为负),也就是说,我们可以通过先操作\(d_1\)和\(d_2\)来......
  • 蓝桥杯练习系统(算法训练)ALGO-962 积木大赛
    资源限制内存限制:128.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s问题描述THU幼儿园举办了一年一度的“积木大赛”。今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi。在搭建开始......
  • 洛谷题单指南-图的基本应用-P1983 [NOIP2013 普及组] 车站分级
    原题链接:https://www.luogu.com.cn/problem/P1983题意解读:由于“如果这趟车次停靠了火车站x,则始发站、终点站之间所有级别大于等于火车站x的都必须停靠”。因此,在始发站和终点站之间,能停靠的车站都是级别较高的,没有停靠的车站都是级别较低的,计算最少有多少个不同级别。解题思路:......
  • 电子积木方案开发商
    东莞市酷得智能科技有限公司电子积木方案开发商提供消费电子解决方案、提供IC技术支持,全国线上线下服务积木小车底层驱动开发过程主要涉及到以下几个方面:首先,需要对小车底盘结构、硬件、模块等有深入的了解。底盘承载着机器人定位、导航、移动、避障等多种功能,是机器人必......
  • P1967 [NOIP2013 提高组] 货车运输 题解
    P1967[NOIP2013提高组]货车运输原题地址思路:由于题目要求的是使两点之间的最小边权最大,所以可以构造最大生成树(最大生成树一定是最大瓶颈生成树,而瓶颈生成树上两点之间的路径,在原图中的所有路径中,最小边权仍然最大,即满足题目要求,详见https://oi-wiki.org/graph/mst/#性质),......
  • JimuReport 积木报表 v1.7.4 正式版本发布,免费的 JAVA 报表工具
    项目介绍一款免费的数据可视化报表,含报表和大屏设计,像搭建积木一样在线设计报表!功能涵盖,数据报表、打印设计、图表报表、大屏设计等!Web版报表设计器,类似于excel操作风格,通过拖拽完成报表设计。秉承“简单、易用、专业”的产品理念,极大的降低报表开发难度、缩短开......
  • 积木报表配置报表
    1.新建报表2.选择数据集来源——SQL数据集3.选择数据源维护数据源可以配置多个数据源点击“新增”按钮,弹出配置的新增窗口,根据自己需要的数据库配置 4.填写编码(配置报表的时候要用)、名称,快速生成sql,也可以自己写5.获取sql中的数据,配置报表 6.保存,填写名称7......
  • 【NOIP2013模拟联考8】匹配(match) 题解
    B组都说看不懂……我也解释不清啊……只能写这么详细了ac自动机ac自动机上dp怎么才能判定一个母串是否包含几个模式串?我们可以想到ac自动机,考虑对模式串建ac自动机,如果我们跑到了一个标记为tail的节点,说明我们的母串包含了这一个模式串。所以我们设\(f[i][s][......
  • JimuReport 积木报表 v1.7.2 紧急发布,修复1.7.1严重Bug
    1.7.2-beta紧急版2024-03-07紧急版本,修复1.7.1版本的严重bug。集成依赖springboot2依赖<dependency><groupId>org.jeecgframework.jimureport</groupId><artifactId>jimureport-spring-boot-starter</artifactId><version>1.7.2-beta</......
  • 卡码java基础课 | 7.摆平积木
    学习内容:用一道题目来练习ArrayList的遍历和访问操作。例题:解:点击查看代码importjava.util.ArrayList;importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);in......