【POJ 3263】Tallest Cow

本文介绍了一种解决特定牛群视线问题的算法。该问题要求确定每头牛的最大可能身高,已知最高牛的位置及若干对能互相看见的牛。通过设定最高牛的身高为基准,利用差分思想更新每头牛的潜在身高。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

NN 头牛站成一行。两头牛能够相互看见,当且仅当它们中间的牛身高都比它们矮。现在,我们只知道其中最高的牛是第 I 头,它的身高是 HH,不知道剩余 N1 头牛的身高,但是,我们还知道 RR 对关系,每对关系都指明了某两头牛 AiBiBi 可以相互看见。求每头牛的身高最大可能是多少。1N,R1041≤N,R≤1041H1061≤H≤106

算法分析

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

代码实现

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值