CodeForces - 491B. New York Hotel(数学)

跟着大佬的步伐

题目链接

题意:
给出你一个 n ∗ m n*m nm的地方,其中a个人的家,b个饭店,让你求出a个人都从家出发到达一个饭店,需要的最长时间最小是多少且第几个饭店。
思路:
是一个分割找边界问题,如果以每个饭店(l,r)为原点的话那么就可以把整个 n ∗ m n*m nm的地方分成四个象限。而应我们要求的最大值,也就是边角(x,y)表示家会成为我们要求的结果,

  1. 对于第一象限最长时间是 x − l + y − r x-l+y-r xl+yr
  2. 对于第二象限最长时间是 l − x + y − r l-x+y-r lx+yr
  3. 对于第三象限最长时间是 l − x + r − y l-x+r-y lx+ry
  4. 对于第四象限最长时间是 x − l + r − y x-l+r-y xl+ry
    说简单点就是横坐标差绝对值加上纵坐标差绝对值。之所以把他分开是因为这样会优化时间,只算边角就行。在化一下,结合一下,把家的放一起,把饭店的放一起

(1). 对于第一象限最长时间是 ( x + y ) + ( − l − r ) (x+y)+(-l-r) (x+y)+(lr)
(2). 对于第二象限最长时间是 ( − x + y ) + ( l − r ) (-x+y)+(l-r) (x+y)+(lr)
(3). 对于第三象限最长时间是 ( − x − y ) + ( r + l ) (-x-y)+(r+l) (xy)+(r+l)
(4). 对于第四象限最长时间是 ( x − y ) + ( − l + r ) (x-y)+(-l+r) (xy)+(l+r)
其实可以看出同一类型的(横纵符号是相反的这样才是距离)
通过上面的结合,我们就得到最远点一定在 这四个边角点,就先找出 ( − l − r ) , ( l − r ) , ( − l + r ) , ( l + r ) (-l-r),(l-r),(-l+r),(l+r) (lr),(lr),(l+r),(l+r)这四组的最大值找出来,然后再加上每个饭店对应的(x,y)求出这四个状态的最大值就是我们要找的那个点,然后再最小化就可以了。

#include<bits/stdc++.h>
using namespace std;
long long sum,ans;
int x[50],y[50];
int main() {
    int n,m,l,r,u,v;
    cin>>u>>v;
    cin>>n;
    for(int i=1; i<=4; i++) {
        x[i]=-1e9+7;
    }

    for(int i=1; i<=n; i++) {
        scanf("%d%d",&l,&r);
        x[1]=max(x[1],-l-r);///第一象限
        x[2]=max(x[2],l-r);///第二象限
        x[3]=max(x[3],l+r);///第三象限
        x[4]=max(x[4],-l+r);///第四象限
    }
    cin>>m;
    int ans=2e9+7,res;
    for(int i=1; i<=m; i++) {
        scanf("%d%d",&l,&r);
        int sum=0;
        sum=max(sum,x[1]+l+r);///第一象限
        sum=max(sum,x[2]-l+r);///第二象限
        sum=max(sum,x[3]-l-r);///第三象限
        sum=max(sum,x[4]+l-r);///第四象限
        if(sum<ans) {
            ans=sum;
            res=i;
        }
    }
    cout<<ans<<endl<<res<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值