题168.洛谷P2866 单调栈-Bad Hair Day S

2023-10-29 10:30
文章标签 day 洛谷 单调 bad 168 hair p2866

本文主要是介绍题168.洛谷P2866 单调栈-Bad Hair Day S,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 题168.洛谷P2866 单调栈-Bad Hair Day S
  • 一、题目
  • 二、题解


题168.洛谷P2866 单调栈-Bad Hair Day S


一、题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、题解

题目要你计算牛往右看,每头牛能看到牛顶的数目之和。依题意我们想,往又右看,也就是只要右边的牛都比当前牛严格矮,那么就能看到牛顶,如果碰到一个不满足这个条件的牛直接让当前牛话下一个,不用再试了,显然这样的做法需要两个循环,效率不够高,怎么办?有没有办法可以只用一个循环来解决问题?
这样,我们不妨换个角度去想,不去想当前牛能够看到右边多少只牛的牛顶,我们去想当前牛能够被左边的多少只牛看到,可是一直再往右边遍历之前的牛都过掉了怎么办?哎,我们可以用栈来存一下之前的牛。再顺着往下想,存在栈里的牛要想看到当前遍历到的牛要满足什么条件?显然必须自栈底向上牛的高度严格递减(越往左的牛必须越高,不然就会有牛被稍微右边的牛挡住,这样就看不到当前牛了),这就是单调栈。
以上述,我们每次遍历到一个牛我去把这个牛的高度和栈顶(栈已维持自底向上严格递减)的牛的高度比较,如果它比栈顶大或者相等,就把栈顶的牛pop掉,直到比它比栈顶小为止,去将此时栈中牛数(这些牛都是可以看到当前牛的)加到总数中,最终总数即为结果

#include <bits/stdc++.h>using namespace std;stack<int> s;int main()
{int N;cin>>N;long long res=0;for(int i=0;i<N;i++){int h;scanf("%d",&h);while(!s.empty()&&h>=s.top())//栈里头只存有机会看到位于他们右边高度为h的牛的牛顶的牛,也就是说,我的栈序列必须自底向上严格递减{s.pop();//淘汰没法看见当前高度h的牛的牛顶的牛}res+=s.size();//将能看见当前h的牛的牛顶的牛加到总数中s.push(h);//将当前高度h的牛入栈}cout<<res<<endl;
}

这篇关于题168.洛谷P2866 单调栈-Bad Hair Day S的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/300030

相关文章

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

POJ1631最长单调递增子序列

最长单调递增子序列 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.StringTokenizer;publ

Linux基础入门 --9 DAY

文本处理工具之神vim         vi和vim简介 一、vi编辑器 vi是Unix及类Unix系统(如Linux)下最基本的文本编辑器,全称为“visual interface”,即视觉界面。尽管其名称中包含“visual”,但vi编辑器实际上工作在字符模式下,并不提供图形界面。vi编辑器以其强大的功能和灵活性著称,是Linux系统中不可或缺的工具之一。 vi编辑器具有三种主要的工作模

day-50 求出最长好子序列 I

思路 二维dp,dp[i][h]表示nums[i] 结尾,且有不超过 h 个下标满足条件的最长好子序列的长度(0<=h<=k),二维数组dp初始值全为1 解题过程 状态转换方程: 1.nums[i]==nums[j],dp[i,h]=Math.max(dp[i,h],dp[j,h]+1) 2.nums[i]!=nums[j],dp[i,h]=Math.max(dp[i,h],dp[j,h-1

[Day 73] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

AI在健康管理中的應用實例 1. 引言 隨著健康管理需求的提升,人工智能(AI)在該領域的應用越來越普遍。AI可以幫助醫療機構提升效率、精準診斷疾病、個性化治療方案,以及進行健康數據分析,從而改善病患的健康狀況。這篇文章將探討AI如何應用於健康管理,並通過具體代碼示例說明其技術實現。 2. AI在健康管理中的主要應用場景 個性化健康建議:通過分析用戶的健康數據,如飲食、運動、睡眠等,AI可

Vue day-03

目录 Vue常用特性 一.响应更新 1. 1 v-for更新监测 1.2 v-for就地更新 1.3 什么是虚拟DOM 1.4 diff算法更新虚拟DOM 总结:key值的作用和注意点: 二.过滤器 2.1 vue过滤器-定义使用 2.2 vue过滤器-传参和多过滤器 三. 计算属性(computed) 3.1 计算属性-定义使用 3.2 计算属性-缓存 3.3 计算属

用Python实现时间序列模型实战——Day 14: 向量自回归模型 (VAR) 与向量误差修正模型 (VECM)

一、学习内容 1. 向量自回归模型 (VAR) 的基本概念与应用 向量自回归模型 (VAR) 是多元时间序列分析中的一种模型,用于捕捉多个变量之间的相互依赖关系。与单变量自回归模型不同,VAR 模型将多个时间序列作为向量输入,同时对这些变量进行回归分析。 VAR 模型的一般形式为: 其中: ​ 是时间  的变量向量。 是常数向量。​ 是每个时间滞后的回归系数矩阵。​ 是误差项向量,假

力扣 739. 每日温度【经典单调栈题目】

1. 题目 理解题意: 1.1. 给一个温度集合, 要返回一个对应长度的结果集合, 这个结果集合里面的元素 i 是 当前 i 位置的元素的下一个更高温度的元素的位置和当前 i 位置的距离之差, 若是当前元素不存在下一个更高温度的元素, 则这个位置用0代替; 2. 思路 本题用单调栈来求解;单调栈就适用于来求当前元素左边或者右边第一个比当前元素大或者小的元素;【单调栈:让栈中的元素保持单调

高精度计算(代码加解析,洛谷p1601,p1303)除法待更新

目录 高精度加法 高精度减法 高精度乘法 高精度加法 我们知道在c++语言中任何数据类型都有一定的表示范围。当两个被加数很大时,正常加法不能得到精确解。在小学,我们做加法都采用竖式方法。那么我们也只需要按照加法进位的方式就能得到最终解。 8 5 6+ 2 5 5-------1 1 1 1 加法进位: c[i] = a[i] + b[i];if(c[i] >=

洛谷 凸多边形划分

T282062 凸多边形的划分 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 先整一个半成品,高精度过两天复习一下补上 #include <iostream>#include <algorithm>#include <set>#include <cstring>#include <string>#include <vector>#include <map>