1901 发射站
其实这个题就是单调栈的板子,然后稍加处理一下就好了
具体的思想就是说通过模拟单调栈的两种情况,来进行枚举接受能量的两种形式,一种是栈顶接收,一种是栈顶被接收
记录在answer数组,然后求最大的答案就好了
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
#include<stack>
using namespace std;
const int SIZE=1e6+5;
const int inf=999999;
int n;
int a[SIZE],h[SIZE],v[SIZE];
int answer[SIZE];
int maxx=-inf;
stack<int> s;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>h[i]>>v[i];
}
s.push(1);//单调栈预处理
for(int i=2;i<=n;i++)
{
//模拟单调栈的两种情况,也就是枚举接受能量的两种形式
if(h[i]<=h[s.top()])
{
answer[s.top()]+=v[i];//栈顶接收
s.push(i);
}
else
{
while(s.size()&&h[i]>h[s.top()])
{
answer[i]+=v[s.top()];//栈顶被接收
s.pop();
}
if(s.size())
answer[s.top()]+=v[i];
s.push(i);
}
}
for(int i=1;i<=n;i++)
{
maxx=max(maxx,answer[i]);//求最大答案
}
cout<<maxx<<endl;
return 0;
}
这篇博客介绍了如何运用单调栈解决1901发射站问题,通过模拟栈的两种情况来处理接收能量的过程。文章通过C++代码展示了如何实现栈的处理逻辑,并最终找出最大能量值。
233

被折叠的 条评论
为什么被折叠?



