单调栈之Bad Hair Day题解

2023-10-09 23:30
文章标签 day 题解 单调 bad hair

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

题目:

Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow is self-conscious about her messy hairstyle, FJ wants to count the number of other cows that can see the top of other cows' heads.

Each cow i has a specified height hi (1 ≤ hi ≤ 1,000,000,000) and is standing in a line of cows all facing east (to the right in our diagrams). Therefore, cow i can see the tops of the heads of cows in front of her (namely cows i+1, i+2, and so on), for as long as these cows are strictly shorter than cow i.

Consider this example:

            =
=          =
=    -     =         Cows facing right -->
=    =    =
= -  = = =
= = = = = =
1 2 3 4 5 6 
Cow#1 can see the hairstyle of cows #2, 3, 4
Cow#2 can see no cow's hairstyle
Cow#3 can see the hairstyle of cow #4
Cow#4 can see no cow's hairstyle
Cow#5 can see the hairstyle of cow 6
Cow#6 can see no cows at all!

Let ci denote the number of cows whose hairstyle is visible from cow i; please compute the sum of c1 through cN.For this example, the desired is answer 3 + 0 + 1 + 0 + 1 + 0 = 5.

Input

Line 1: The number of cows, N. 
Lines 2..N+1: Line i+1 contains a single integer that is the height of cow i.

Output

Line 1: A single integer that is the sum of c 1 through cN.

Sample Input

6
10
3
7
4
12
2
Sample Output

5
题意:

每个奶牛都有一个高度,奶牛们排成一排,且面朝右方向,问每个奶牛能看到奶牛数目的和是多少

  • 解题思路

可以使用单调栈来解决此题。从每只奶牛能看到多少脑袋,转换为它能被多少人看到,即每只奶牛后方(注意:奶牛是面朝右边的)有多少比它高的存在(存在遮挡现象,如果某只奶牛后方的一只或者多只奶牛比它矮,那么这一只或者多只就需要出栈)

该题源自于北大OJ:3250 -- Bad Hair Day 

具体的解题思路如下,以该题的样例为例:10 3 7 4 12 2

1、将第1个元素入

2、将第2个元素与栈顶元素进行比较

        如果第2个元素大于栈顶元素就将栈顶元素出栈,代表此时第1个元素看不到第2个元素。

        如果第2个元素小于等于栈顶元素。此时计数变量+1,代表第1个元素可以看到第2个元素,并且将第2个元素入栈。 将第3个元素与栈顶元素进行比较

3、3个元素与栈顶元素进行比较

        如果第3个元素大于栈顶元素就将栈顶元素出栈,代表此时第2个元素看不到第3个元素,出栈后,让第3个元素再次与栈顶元素比较,直到栈空或者第3个元素小于等于栈顶元素

        如果第3个元素小于等于栈顶元素。此时计数变量+栈中的元素个数,代表栈中的每个元素都可以看到第3个元素,之后以此类推,如下图演示

AC代码:

注意:这里要注意数据的范围,计数变量sum可能会超过int范围,需要定义为long long类型

#include<iostream>
#include<stack>
using namespace std;
int a[100000];
long long  sum=0;
stack<int> s;
//6 10 3 7 4 12 2
void nextLesser(int a[],int n)
{for(int i=1;i<=n;i++){//单调栈,>= while(!s.empty()&&s.top()<=a[i]){s.pop();	}sum+=s.size();s.push(a[i]); }	
}
int main()
{int n;scanf("%d",&n); for(int i=1;i<=n;i++){scanf("%d",&a[i]);}nextLesser(a,n);cout<<sum;return 0;
}

总结: 

        不断练习,不断总结。

        前路漫漫,当克己,当慎独。

        欢迎广大朋友,加入算法群进行讨论和分享资料

        

这篇关于单调栈之Bad Hair Day题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

day-51 合并零之间的节点

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

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

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

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样

Linux基础入门 --9 DAY

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

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述

LeetCode 第414场周赛个人题解

目录 Q1. 将日期转换为二进制表示 原题链接 思路分析 AC代码 Q2. 范围内整数的最大得分 原题链接 思路分析 AC代码 Q3. 到达数组末尾的最大得分 原题链接 思路分析 AC代码 Q4. 吃掉所有兵需要的最多移动次数 原题链接 思路分析 AC代码 Q1. 将日期转换为二进制表示 原题链接 Q1. 将日期转换为二进制表示 思路分析

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可