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;
     }

    结束。

    善用前缀和!

  • 相关阅读:
    js中this应用
    易语言学习
    哈希表和字典List和Ilist和array和arraylist的应用
    ExtJs中decode与encode(转载)
    ajax几种请求几种类型
    关于Json
    简单属性margin和padding
    ==和===的区别
    maven实战读书笔记(三)
    maven实战读书笔记(二)
  • 原文地址:https://www.cnblogs.com/HHHG/p/11101071.html
Copyright © 2011-2022 走看看