牛的视野(单调栈问题)

题目:一群高度不完全相同的牛从左到右站成一排,每头牛只能看见它右边的比它矮的牛的发型,若遇到一头高度大于或等于它的牛,则无法继续看到这头牛和后面的其他牛的发型。给出这些牛的高度,要求每头牛可以看到的牛的数量的和。

解析:若求每头牛能看到的牛的数量,可以参考https://blog.youkuaiyun.com/Broken_Wave/article/details/82390882,也是使用单调栈

在这里我们把问题等效于每头牛可以被看到的次数之和来求解

构建一个单调栈,栈底元素最大,从左到右依次读取牛的高度,当当前高度小于栈顶元素时,代表目前栈里的牛都可以看到这头牛,记录目前栈里的元素,然后把当前高度入栈,继续下一个操作

import java.util.Scanner;
import java.util.Stack;

public class Main {

	public static void main(String[] arg) {
		Scanner sc = new Scanner(System.in);
		int n=sc.nextInt();
		Stack<Integer> st=new Stack<Integer>();
		int sum=0;
		//首先压入初始值
		st.push(sc.nextInt());
		int now=0;
		//依次读入高度
		for(int i=1;i<n;i++) {
			now=sc.nextInt();
			//当栈不为空并且栈顶元素小于等于当前高度,栈顶出栈,
			
			while(!st.isEmpty()&&now>=st.peek()) {
				st.pop();
			}
			//栈里的牛应该都是能看到当前牛的,栈的大小即能看到当前牛的数量
			sum+=st.size();
			st.push(now);
		}
		System.out.println(sum);
	}
}

 

题目描述 包包有 � N 头,每头的品种要么是 � G(Guernsey),要么是 � H(Holstein)。这些排成一排,编号为 1 1 到 � N。 每头会记录一个列表,其中第 � i 头的列表包含从她自己(第 � i 头)开始到第 � � E i ​ 头( � ≤ � � ≤ � i≤E i ​ ≤N)的所有。 包包发现,每个品种的都有一个独特的领导者。领导者的列表必须满足以下条件之一: 包含该品种的所有; 包含另一个品种的领导者; 同时满足以上两点。 请你帮助包包计算可能的领导者对数。题目保证至少存在一对可能的领导者。 输入格式 第一行输入 1 1 个数,表示的数量 � N。 第二行输入一个长度为 � N 的字符串,其中第 � i 个字符表示第 � i 头的品种( � G 或 � H)。 第三行输入 � N 个数,分别表示 � 1 , � 2 , … , � � E 1 ​ ,E 2 ​ ,…,E N ​ 。 输出格式 输出 1 1 行,表示可能的领导者对数。 输入数据 1 4 GHHG 2 4 3 4 输出数据 1 1 样例解析 唯一有效的领导者对是 ( 1 , 2 ) (1,2)。第 1 1 头的列表包含另一个品种的领导者(第 2 2 头)。第 2 2 头的列表包含她品种的所有(Holstein)。 输入数据 2 3 GGH 2 3 3 输出数据 2 2 样例解析 有效的领导者对是 ( 1 , 3 ) (1,3)( 2 , 3 ) (2,3)。 数据范围 2 ≤ � ≤ 10 5 2≤N≤10 5 字符串仅包含 � G 和 � H,且至少各有一个。 � ≤ � � ≤ � i≤E i ​ ≤N( 1 ≤ � ≤ � 1≤i≤N) c++,不要注释
最新发布
08-07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值