zoukankan      html  css  js  c++  java
  • bzoj 3170 Tjoi 2013 松鼠聚会 曼哈顿距离&&切比雪夫距离

      因为曼哈顿距离很好求,所以要把每个点的坐标转换一下。

      转自:http://blog.csdn.net/slongle_amazing/article/details/50911504

      题解

      

          两个点的切比雪夫距离为d=max(|x1−x2|,|y1−y2|)
        写一下曼哈顿距离的常用处理方法
      两个点(x1,y2),(x2,y2)

      其曼哈顿距离=|x1−x2|+|y1−y2|
      因为|x1−x2|=max(x1−x2,x2−x1)
      所以可以写成=max(x1−x2+y1−y2,x1−x2+y2−y1,x2−x1+y1−y2,x2−x1+y2−y1)

      =max((x1+y1)−(x2+y2),(x1−y1)−(x2−y2),−(x1−y1)+(x2−y2),−(x1+y1)+(x2+y2))

      =max(|(x1+y1)−(x2+y2)|,|(x1−y1)−(x2−y2)|)

      令x′=x+y,y′=x−y=max(|x′1−x′2|,|y′1−y′2|)

      这样曼哈顿距离就被转化为了切比雪夫距离
      同理,我们把切比雪夫距离转化为曼哈顿距离(x,y)=((x+y)/2,(x−y)/2)
      就转化为了n−1个点到一个点的曼哈顿距离最小
      计算曼哈顿距离x和y分开计算即可

      

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstdio>
     4 #include<cstring>
     5 #define ll long long
     6 #define N 100005
     7 using namespace std;
     8 int n;
     9 struct node
    10 {
    11     int x,y,id;
    12     friend bool operator < (node aa,node bb)
    13     {
    14         return aa.x<bb.x;
    15     }
    16 }a[100005];
    17 ll ans[N],sum[N];
    18 bool cmp(node aa,node bb)
    19 {
    20     return aa.y<bb.y;
    21 }
    22 int main()
    23 {
    24     scanf("%d",&n);int t1,t2;
    25     for(int i=1;i<=n;i++)
    26     {
    27         scanf("%d%d",&t1,&t2);
    28         a[i].x=t1+t2;a[i].y=t1-t2;a[i].id=i;
    29     }
    30     sort(a+1,a+n+1);
    31     for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i].x;
    32     for(int i=1;i<=n;i++)
    33     {
    34         ans[a[i].id]+=(ll)a[i].x*(i-1)-sum[i-1];
    35         ans[a[i].id]+=(sum[n]-sum[i])-((ll)a[i].x*(n-i));
    36     }
    37     sort(a+1,a+n+1,cmp);
    38     for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i].y;
    39     for(int i=1;i<=n;i++)
    40     {
    41         ans[a[i].id]+=(ll)a[i].y*(i-1)-sum[i-1];
    42         ans[a[i].id]+=(sum[n]-sum[i])-((ll)a[i].y*(n-i));
    43     }
    44     ll mx=1ll<<62;
    45     for(int i=1;i<=n;i++)mx=min(mx,ans[i]);
    46     printf("%lld
    ",mx/2);
    47     return 0;
    48 }
  • 相关阅读:
    一些算法思路整理
    (递归描述)根据上排给出十个数,在其下排填出对应的十个数
    在二元树中找出和为某一值的所有路径(树)--最容易理解的版本?
    动态规划求解连续子数组最大和问题(应该是新的描述方法?)
    ubuntu/linux 下 git 通过代理下载数据 (最简单的方式)
    3. Longest Substring Without Repeating Characters(c++) 15ms
    1.Two Sum(c++)(附6ms O(n) accepted 思路和代码)
    3篇NeuroImage文献分析
    PCA、ZCA白化
    mysql创建全文索引
  • 原文地址:https://www.cnblogs.com/ezyzy/p/6510795.html
Copyright © 2011-2022 走看看