洛谷:P1901 發射站
阿新 • • 發佈:2018-09-28
max 直接 %d int += -- 輸出 www 地址
原題地址:https://www.luogu.org/problemnew/show/P1901
題目簡述
有 N 個能量發射站排成一行,每個都有不相同的高度 \(H_i\),能向兩邊(當然兩端的只能向一邊)同時發射能量值為\(V_i\) 的能量,並且發出的能量只被兩邊最近的且比它高的發射站接收。
顯然,每個發射站發來的能量有可能被0或1或2個其他發射站所接受,求接收最多能量的發射站接收的能量是多少。
思路
每個能量塔射出的能量被左右第一個比其高的塔所攔截。隱隱約約覺得可以用單調棧搞……
維護一個高度單調不升棧,考慮依次將能量塔i加入棧:
- 如果高度比棧頂元素大或棧空,棧頂元素能量加上\(V_i\),壓入棧;
- 如果高度比棧頂元素小(棧頂元素編號記為top),當前能量塔i接收的能量加上\(V_{top}\),彈出棧頂元素。重復執行直到符合情況1,按1的處理方法處理。
最後直接掃描一遍最大值,輸出。
代碼
#include <bits/stdc++.h> using namespace std; int s1[1000010],h[1000010],v[1000010],sum[1000010],ans,n,top; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%d",&h[i],&v[i]); while(top&&h[s1[top]]<h[i]) sum[i]+=v[s1[top]],top--; sum[s1[top]]+=v[i]; top++; s1[top]=i; } for(int i=1;i<=n;i++) ans=max(ans,sum[i]); printf("%d",ans); return 0; }
洛谷:P1901 發射站