zoukankan      html  css  js  c++  java
  • 洛谷P1901发射站

    题目

    一道单调栈裸题,主要是用单调栈维护单调性,和单调队列都可以在(O(n))的时间内得出单调最大值或最小值,要比堆要快。

    这个题可以用h来当做单调栈的使用对象,即用单调栈来维护高度,高度是越在栈深处越大,元素下标是越在栈深处越小。

    (Code):

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <cstdio>
    #include <cstdlib>
    #include <stack>
    #define N 1100001
    using namespace std;
    struct da {
    	int H, V, MAXN;//H,V分别代表本身的高度,MAXN代表以i这个发射站所得到的最大值。 
    } stac[N];
    int n, maxn, top, now;
    int main()
    {
     	scanf("%d", &n);
     	for (int i = 1, h, v; i <= n; i++)
     	{
     		scanf("%d%d", &h, &v);now = 0;
     		while (top && stac[top].H < h)//寻找第一个大于等于h的栈内元素.而且不仅要将小于h的栈内元素出栈 ,而且还要把这第一个元素出栈,因为该元素已经不可以在向右发挥作用了,且右边的发射站也肯定不会向左给该元素发挥作用了,那它就没用了。 
     				now += stac[top--].V; 
     		if (stac[top].H > h)
    			stac[top].MAXN += v;
     		stac[++top].H = h, stac[top].V = v, stac[top].MAXN = now;
     		if (top == 1)
     		maxn = max(maxn, stac[top].MAXN);
     		else//因为top元素和top-1元素在此次循环中都增加了,但不知道那个大,所以要判断。 
     		maxn = max(maxn, max(stac[top].MAXN, stac[top - 1].MAXN));
     	}
     	printf("%d", maxn);
    }
    
  • 相关阅读:
    windows开启PostgreSQL数据库远程访问
    Git使用介绍
    linux 常用工具记录及简介
    ubuntu18 安装坑点记录(华硕飞行堡垒)
    快手自动视频随机点赞脚本
    接触手机脚本编程------基于触动精灵的lua编程
    使电脑蜂鸣器发声小脚本
    tensorflow--非线性回归
    python笔记--------numpy
    python笔记--------二
  • 原文地址:https://www.cnblogs.com/liuwenyao/p/11040978.html
Copyright © 2011-2022 走看看