zoukankan      html  css  js  c++  java
  • Tallest Cow

     制胜法宝   
                                     ------前缀和

    233

    当两头牛能够互相看见时,他们之间的牛的身高都要比他们低,且题目要求牛身高最大。即:

    int c[10005],a,b;//设牛的身高用c数组表示,两头牛分别为a,b;(a<b)
    for(int i=a+1;i<=b-1;i++)
    {
       c[i]--;
    }

    依次处理每一组数据,则第n头牛的身高为:(最高的牛的身高+c[n]);

    时间爆炸!(O(n*m))

    额外建立d数组,对于每组能够互相看见的牛(a,b),令d[a+1]--,d[b]++;

    最后c[n]=c[n-1]+d[n];(c->d的前缀和)

    牛i高=(最高的牛的身高+c[i])

    这样就避免了对牛a与牛b之间牛的处理。

    (提示:
    1.a必须小于b,
    2.牛的关系可能会输入多次。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    int fz[10005],n,i,h,r,ans[10005];
    struct re
    {
        int x,y;
    }rep[20005];
    int main()
    {
        memset(rep,0,sizeof(rep));
        scanf("%d%d%d%d",&n,&i,&h,&r);
        for(int i=1;i<=r;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            if(a>b)
            swap(a,b);
            if(rep[a+b].x==a&&rep[a+b].y==b)
            {
                continue;
            }
            fz[a+1]--;
            fz[b]++;
            rep[a+b].x=a;
            rep[a+b].y=b;
        }
        for(int i=1;i<=n;i++)
        {
            ans[i]=ans[i-1]+fz[i];
            cout<<h+ans[i]<<endl;
        } 
        return 0;
     }

    结束。

    善用前缀和!

  • 相关阅读:
    Python 队列
    Python 栈
    Python面试百题
    TCP:四次挥手
    TCP:三次握手
    SQL:八 SQL高级处理
    SQL:七 集合运算
    SQL:六 函数、谓词、CASE表达式
    SQL:五 复杂查询
    python爬虫——爬取网页数据和解析数据
  • 原文地址:https://www.cnblogs.com/HHHG/p/11101071.html
Copyright © 2011-2022 走看看