• 洛谷P2866 [USACO06NOV]糟糕的一天Bad Hair Day


    P2866 [USACO06NOV]糟糕的一天Bad Hair Day

      • 75通过
      • 153提交
    • 题目提供者洛谷OnlineJudge
    • 标签USACO2006云端
    • 难度普及/提高-
    • 时空限制1s / 128MB

      讨论  题解  

    最新讨论更多讨论

    • 题目标题

    题目描述

    Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow is self-conscious about her messy hairstyle, FJ wants to count the number of other cows that can see the top of other cows' heads.

    Each cow i has a specified height hi (1 ≤ hi ≤ 1,000,000,000) and is standing in a line of cows all facing east (to the right in our diagrams). Therefore, cow i can see the tops of the heads of cows in front of her (namely cows i+1, i+2, and so on), for as long as these cows are strictly shorter than cow i.

    Consider this example:

            =

    =       =

    =   -   =         Cows facing right -->

    =   =   =

    = - = = =

    = = = = = =

    1 2 3 4 5 6 Cow#1 can see the hairstyle of cows #2, 3, 4

    Cow#2 can see no cow's hairstyle

    Cow#3 can see the hairstyle of cow #4

    Cow#4 can see no cow's hairstyle

    Cow#5 can see the hairstyle of cow 6

    Cow#6 can see no cows at all!

    Let ci denote the number of cows whose hairstyle is visible from cow i; please compute the sum of c1 through cN.For this example, the desired is answer 3 + 0 + 1 + 0 + 1 + 0 = 5.

    农民约翰的某N(1 < N < 80000)头奶牛正在过乱头发节!由于每头牛都意识到自己凌乱不堪 的发型,约翰希望统计出能够看到其他牛的头发的牛的数量.

    每一头牛i有一个高度所有N头牛面向东方排成一排,牛N在最前面,而 牛1在最后面.第i头牛可以看到她前面的那些牛的头,只要那些牛的高度严格小于她的高度,而且 中间没有比hi高或相等的奶牛阻隔.

    让N表示第i头牛可以看到发型的牛的数量;请输出Ci的总和

    输入输出格式

    输入格式:

    Line 1: The number of cows, N.

    Lines 2..N+1: Line i+1 contains a single integer that is the height of cow i.

    输出格式:

    Line 1: A single integer that is the sum of c1 through cN.

    输入输出样例

    输入样例#1:
    6
    10
    3
    7
    4
    12
    2
    输出样例#1:
    5
    分析:很显然是单调栈,至于单调栈的用法可以去看我的前几篇博客,这里计数器累加的top代表这只牛的头发能被前面的多少只牛看到(因为前面有top只牛比这只牛高).
    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    int n,h[500010],stk[500010],top;
    long long ans;
    
    int main()
    {
        scanf("%d", &n);
        for (int i = 1; i <= n; i++)
            scanf("%d", &h[i]);
    
        for (int i = 1; i <= n; i++)
        {
            while (top != 0 && stk[top] <= h[i])
                top--;
            ans += top;
            stk[++top] = h[i];
        }
        printf("%lld", ans);
    
        return 0;
    }
    
    
  • 相关阅读:
    Python学习之路:MINST实战第一版
    Python学习之路:NumPy进阶
    Python学习之路:NumPy初识
    Python学习之路:一天搞定基础部分
    7. 整数反转(leetcode)
    1. 两数之和(leetcode)
    172. 阶乘后的零(leetcode)
    Java模拟斗地主发牌(Collections工具类的应用)
    CF刷题-Codeforces Round #481-G. Petya's Exams
    【android】安卓平台版本和API版本的对应关系
  • 原文地址:https://www.cnblogs.com/zbtrs/p/7050035.html
Copyright © 2020-2023  润新知