zoukankan      html  css  js  c++  java
  • 洛谷3964 [TJOI2013]松鼠聚会

    题目描述

    草原上住着一群小松鼠,每个小松鼠都有一个家。时间长了,大家觉得应该聚一聚。但是草原非常大,松鼠们都很头疼应该在谁家聚会才最合理。

    每个小松鼠的家可以用一个点x,y表示,两个点的距离定义为点(x,y)和它周围的8个点(x-1,y)(x+1,y),(x,y-1),(x,y+1).(x-1,y+1),(x-1,y-1),(x+1,y+1),(x+1,y-1)距离为1。

    输入输出格式

    输入格式:

    第一行是一个整数N,表示有多少只松鼠。接下来N行,第i行是两个整数x和y,表示松鼠i的家的坐标

    输出格式:

    一个整数,表示松鼠为了聚会走的路程和最小是多少。

    输入输出样例

    输入样例#1: 
    6
    -4 -1
    -1 -2
    2 -4
    0 2
    0 3
    5 -2
    输出样例#1: 
    20
    输入样例#2: 
    6
    0 0
    2 0
    -5 -2
    2 -2
    -1 2
    4 0
    输出样例#2: 
    15

    说明

    样例解释

    在第一个样例中,松鼠在第二只松鼠家(-1,-2)聚会;在第二个样例中,松鼠在第一只松鼠家(0.0)聚会。

    数据范围

    30%的数据,0 ≤ N ≤ 1000

    100%的数据,0 ≤ N ≤ 100000; −10^9 ≤ x, y ≤ 10^9

    做法

    本题两点间的距离是max(|x1-x2|,|y1-y2|),曾经在黄学长的博客里看到过一个转化 

    求这个距离可以把点的坐标都转化成 (x+y)/2,(x-y)/2  然后的曼哈顿距离就是这个了

    这个好像叫 切比雪夫距离

    之后我们预处理前缀和,枚举源点就可以了。

    记得都开longlong 我WA的很悲惨

    #include<bits/stdc++.h>
    #define MAXN 100005
    using namespace std;
    int read(){
        int x=0,t=1;char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')t=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*t; 
    } 
    struct Node{
        long long X,Y; 
    }a[MAXN]; 
    int N,x[MAXN],y[MAXN],pos;
    long long ans=1ll<<62,s1[MAXN],s2[MAXN];
    int main()
    {
        N=read();
        for(int i=1;i<=N;i++){
            int p=read(),q=read();
            x[i]=a[i].X=p+q;
            y[i]=a[i].Y=p-q;
        }
        sort(x+1,x+N+1);
        sort(y+1,y+N+1);
        for(int i=1;i<=N;i++)
            s1[i]=s1[i-1]+x[i],
            s2[i]=s2[i-1]+y[i];
        for(int i=1;i<=N;i++){
            long long tmp=0;
            pos=lower_bound(x+1,x+N+1,a[i].X)-x;
            tmp+=s1[N]-s1[pos]-a[i].X*(N-pos)+a[i].X*pos-s1[pos];
            pos=lower_bound(y+1,y+N+1,a[i].Y)-y;
            tmp+=s2[N]-s2[pos]-a[i].Y*(N-pos)+a[i].Y*pos-s2[pos];
            ans=min(ans,tmp);
        }
        printf("%lld
    ",ans/2);
        return 0;
    } 
  • 相关阅读:

    k
    通过类名调用类方法
    类Area的getArea方法是一个重载方法
    构造cry
    两个lader对象共享bottom
    向一个方法的基本数据类型参数传值
    Circle
    常量的用法
    显示本机时间
  • 原文地址:https://www.cnblogs.com/Elfish/p/7931766.html
Copyright © 2011-2022 走看看