【POJ 3263】Tallest Cow

题目描述

N 头牛站成一行。两头牛能够相互看见,当且仅当它们中间的牛身高都比它们矮。现在,我们只知道其中最高的牛是第 I 头,它的身高是 H ,不知道剩余 N 1 头牛的身高,但是,我们还知道 R 对关系,每对关系都指明了某两头牛 A i B i 可以相互看见。求每头牛的身高最大可能是多少。 1 N , R 10 4 1 H 10 6

算法分析

首先,我们将最高的牛的身高看为 0 ,每头牛的初始身高也是 0 ,然后每获得一对关系 A i , B i ,我们就将 [ A i + 1 , A j 1 ] 内的身高都减去 1 ,最后再将所有牛的身高都加上 H ,输出答案即可。
由于给出的方案不存在交叉,即 A i A k < A j A l ,所以上述做法不会出现问题,需要注意的是判断一对关系是否多次输入,如果有多次输入,处理一次即可。

代码实现

#include <cstdio>
#include <set>
#include <utility>
#include <algorithm>
typedef std::pair<int,int> P;
int arr[10005];
std::set<P> s;
int main() {
    int n,i,h,r;
    scanf("%d%d%d%d",&n,&i,&h,&r);
    arr[1]+=h;arr[n+1]-=h;
    int a,b;
    while(r--) {
        scanf("%d%d",&a,&b);
        int x=std::min(a,b),y=std::max(a,b);
        if(s.count(P(x,y))) continue;
        s.insert(P(x,y));
        arr[x+1]+=-1;arr[y]-=-1;
    }
    int now=0;
    for(int i=1;i<=n;++i) printf("%d\n",now+=arr[i]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/whz2018/article/details/81215434