首页 > 其他分享 >洛谷 P1969 [NOIP2013 提高组] 积木大赛 - 小思维

洛谷 P1969 [NOIP2013 提高组] 积木大赛 - 小思维

时间:2023-10-07 21:34:21浏览次数:47  
标签:pre 洛谷 积木 int top leq P1969 ans NOIP2013

洛谷 P1969 [NOIP2013 提高组] 积木大赛

[NOIP2013 提高组] 积木大赛

题目描述

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

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

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

输入格式

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

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

输出格式

建造所需的最少操作数。

样例 #1

样例输入 #1

5
2 3 4 1 2

样例输出 #1

5

提示

【样例解释】

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

【数据范围】

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

思路

  • 法一:模拟题意
    从前往后依次比较相邻数值大小,如果前面的比后面的大,那么前面的某次操作可以覆盖后面,对答案无贡献;如果前面的比后面小,那么后面的需要额外的操作补足这个高出的部分,高出的部分即为操作的次数
void solve(){
	int n, a, ans = 0, last = 0;
	cin >> n;
	for(int i = 0; i < n; ++ i){
		cin >> a;
		if(a > last) ans += a - last;
		last = a;
	}
	cout << ans << '\n';
	return ;
}
  • 法二:维护一个递增的单调栈,那么遇到大数先进栈,遇到小数则前面的操作无法为后面产生继续的贡献,出栈并统计答案。记得最后栈内还有元素时最后一个元素一步操作即可
ll n, a[maxm];

void solve(){
	cin >> n;
	stack<int> q;
	ll ans = 0;
	for(int i = 0; i < n; ++ i){
		cin >> a[i];
		int pre = -1;
		while(q.size() && q.top() > a[i]){
			if(pre != -1)
				ans += pre - q.top();
			pre = q.top();
			q.pop();
		}
		if(pre != -1) ans += pre - a[i];
		if(q.empty() || q.top() < a[i]){
			q.push(a[i]);
		}
	}
	int pre = -1;
	while(q.size()){
		if(pre != -1)
			ans += pre - q.top();
		pre = q.top();
		q.pop();
	}
	if(pre != 0 && pre != -1) ans += pre;
	cout << ans << '\n';
	return ;
}

标签:pre,洛谷,积木,int,top,leq,P1969,ans,NOIP2013
From: https://www.cnblogs.com/Qiansui/p/17747518.html

相关文章

  • 洛谷3501宝牌一大堆
    这道题很长一读完可以发现不是模拟题,那么这道题还有这么多情况供我们去讨论,则一般都是可以去掉一些情况的我们发现,对任意一种和牌,如果有杠子,我们把这个杠子换成少一张牌的刻字答案是会变得更优的(很简单的列算式)所以就不用考虑大于15张牌的情况了对于国士无双暴力即可对于七对......
  • 洛谷355BAJ-Bytecomputer8
    这一道题如果直接做是没有什么思路的,所以我们合理猜测应该是有什么结论看这个数列最开始就只有三个值,所以我们猜测最后也只有这三个值下面是证明首先第一个数最小是-1,所以所有数的下界是-1其次如果存在某一个数大于1,我们找到这个数列最前面的这个数,那他前面的数肯定是1,然后对......
  • holiday 假期题解(洛谷搬家)
    P5892holiday假期题解前言:如果您想要过这一道题,需要的前置条件:知道什么是决策单调性。知道可持久化线段树怎么找前$k$大。有耐心看很多文字。对于第二点,如果您不会的话,可以参考我的学习笔记(专门为过这道题做的)。链接:https://i.cnblogs.com/posts/edit;postId=1769732......
  • 【洛谷 P1739】表达式括号匹配 题解(栈)
    表达式括号匹配题目描述假设一个表达式有英文字母(小写)、运算符(+、-、*、/)和左右小(圆)括号构成,以@作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则输出YES;否则输出NO。表达式长度小于,左圆括号少于个。输入格式一行:表达式。输出格式一行:YES或NO......
  • 【题解】洛谷#P7073 [CSP-J2020] 表达式
    【题解】洛谷#P7073[CSP-J2020]表达式Description给定一个逻辑表达式和其中每一个操作数的初始取值后,再取反某一个操作数的值时,求出原表达式的值。表达式将采用后缀表达式的方式输入。Solution根据题目可得,当取反一个操作数的值时,整个表达式大体只有变与不变两种情况,而往下......
  • 关于洛谷题解审核
    我想问一下,大家觉得题解的重点是什么?很显然是思路,代码的正确性,次要的才是格式。但是,洛谷对于题解格式的审核是不是有点过于严格了呢?比如说这段话:如果\(n\)为\(0\),那么便是无解。大家能一眼看出,后面多了空格吗?这种题解其实没什么大问题,别人看题解时根本不会在意这些......
  • 洛谷 P7830 [CCO2021] Through Another Maze Darkly
    洛谷传送门被联考创出shit了。考虑一种极限情况:每个点指向父亲。那么这种情况我们会顺着欧拉序完整地把整棵树都走一遍。但是初始的时候不一定每个点都指向父亲。发现我们走过\(O(n^2)\)步就能到达上面的极限情况。比较显然,因为每次扩展至少使一个点从不指向父亲变成指向父......
  • 洛谷5324 删数
    首先给出结论:对于一个数列,某一个数字\(i\)的个数有\(cnt[i]\)个,那么此数字可以覆盖一个区间\([i-cnt[i]+1,i]\),遍历每一个数字并记录每个区间,最后答案就是没有被覆盖到的数字的个数证明:任意修改一个数字,会使一个\(cnt\)减一(这至多会产生一个没有被覆盖的数),另一个\(cnt\)加一(这至......
  • 洛谷 Power Tree 题解
    题目链接PowerTree分析将叶子节点按dfs序重标号后,每次控制操作可以转化为将子树内叶子节点所在区间加(或减)一个数不难可以想到将叶子区间进行差分每次对\(l\)到\(r\)的操作可以转化为将\(l\)上的数转移到\(r+1\)上每次操作后差分数组的和不变将所有点权变为\(0\)......
  • 洛谷P5303
    这一道题跟NOIP集训模拟赛1的D题非常像,当然D题的递推方程更复杂(磁盘里面有题解pdf)对于这一道题,我们设f[i][0]表示铺了i列而且全部用的完整的砖的方案数f[i][1]表示铺了i列,但是第i列缺了一个而且第i列的唯一的那一块砖头就是1X1其中一个f[i][2]表示铺了i列,但是第i列缺了一个而且......