牛客3402B-麻煩的傑西-單調棧

題目描述:

鏈接:https://ac.nowcoder.com/acm/contest/3402/B
來源:牛客網

聖誕節那一天,傑西收到一個聖誕蛋糕,不過這個蛋糕有點參差不齊,具體地說這個蛋糕是由n個小蛋糕拼起來的,每個小蛋糕長度爲1,寬度爲1,高度爲hi。這對於“精緻”的傑西來說是不能容忍的,所以她決定來“橫切”蛋糕。具體地說:聖誕蛋糕放在水平面上,傑西先沿某一高度水平橫切過去,再留下相同高度並連續的小蛋糕們。也就是她會把不同高度的小蛋糕和雖然同一高度但與被留下的小蛋糕們不連續的小蛋糕扔掉。傑西不想浪費太多蛋糕,所以她想盡可能多地留下小蛋糕。

請問傑西最多能留下多少體積的蛋糕和對應的蛋糕高度是多少?若橫切後(當然也可以不橫切),出現多個體積相同的蛋糕,傑西不需要得到高度最高的蛋糕,而是直接留下更靠左的蛋糕。

輸入描述:

多測試用例,用例數不超過10組
每個測試用例,第一行爲一個正整數n(n<=100000)
第二行有n個整數hi代表每個小蛋糕的高度(1<=hi<=1000000000 )

輸出描述:

輸出佔一行。倆個整數H和C用空格隔開,分別代表被傑西留下的最多的小蛋糕的高度和總體積。

輸入樣例:

8
2 1 7 7 8 1 5 7

輸出樣例:

7 21

核心思想:

單調棧模板題

代碼如下:

#include<cstdio>
#include<iostream>
#include<stack>
using namespace std;
typedef long long ll;
struct node
{
	ll p,h;
	node()
	{
	}
	node(ll pp,ll hh)
	{
		p=pp;
		h=hh;
	}
};
stack<node>st;
int main()
{
	int n;
	ll x;
	while(cin>>n)
	{
		node ans(0,0);
		ll v=0;
		for(int i=1; i<=n; i++)
		{
			scanf("%lld",&x);
			while(!st.empty()&&st.top().h>=x)
			{
				node te=st.top();
				st.pop();
				ll l=st.empty()?0:st.top().p,r=i-1;
				ll tv=te.h*(r-l);
				if(tv>v||tv==v&&ans.p>te.p)
				{
					v=tv;
					ans=te;
				}
			}
			st.push(node(i,x));
		}
		while(!st.empty())
		{
			node te=st.top();
			st.pop();
			ll l=st.empty()?0:st.top().p,r=n;
			ll tv=te.h*(r-l);
			if(tv>v||tv==v&&ans.p>te.p)
			{
				v=tv;
				ans=te;
			}
		}
		printf("%lld %lld\n",ans.h,v);
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章