zoukankan      html  css  js  c++  java
  • Evanyou Blog 彩带

      题目传送门

      

    题目描述

    After scrimping and saving for years, Farmer John has decided to build a new barn. He wants the barn to be highly accessible, and he knows the coordinates of the grazing spots of all N (2 ≤ N ≤ 10,000 cows. Each grazing spot is at a point with integer coordinates (Xi, Yi) (-10,000 ≤ Xi ≤ 10,000; -10,000 ≤ Yi ≤ 10,000). The hungry cows never graze in spots that are horizontally or vertically adjacent.

    The barn must be placed at integer coordinates and cannot be on any cow's grazing spot. The inconvenience of the barn for any cow is given the Manhattan distance formula | X - Xi | + | Y - Yi|, where (X, Y) and (Xi, Yi) are the coordinates of the barn and the cow's grazing spot, respectively. Where should the barn be constructed in order to minimize the sum of its inconvenience for all the cows? 给出平面上n个不相邻的点,要求到这n个点的曼哈顿距离之和最小的点的个数ans2,和这个最小距离ans1。

    输入输出格式

    输入格式:

     

    Line 1: A single integer: N

    Lines 2..N+1: Line i+1 contains two space-separated integers which are the grazing location (Xi, Yi) of cow i

     

    输出格式:

     

    Line 1: Two space-separated integers: the minimum inconvenience for the barn and the number of spots on which Farmer John can build the barn to achieve this minimum.

     

    输入输出样例

    输入样例#1: 复制
    4
    1 -3
    0 1
    -2 1
    1 -1
    输出样例#1: 复制
    10 4

    说明

    The minimum inconvenience is 10, and there are 4 spots that Farmer John can build the farm to achieve this: (0, -1), (0, 0), (1, 0), and (1, 1).


      分析:由题意可以得出,ans2=∑(|x-x[i]|+|y-y[i]|),那么很显然越是靠中的点ans2就会越小,那么就要分情况来考虑,如果n是奇数,那么就直接由各个点的中位点来算(也就是排序以后得到一个x[n/2+1],y[n/2+1]),但是要求不能有已经给出的点,所以要在(x,y+1),(x+1,y),(x-1,y),(x,y-1)四个点,即上下左右每个点进行计算和判断。如果n是偶数,那么排序以后得到的是一个2*2的矩阵,那么就在这个矩阵中对每个点进行计算判断。具体看代码。

      Code:

     

    //It is made by HolseLee on 21st Apr 2018
    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e4+7;
    int n,ans,cnt;
    int dx[4]={0,0,1,-1};
    int dy[4]={1,-1,0,0};
    struct Node{
      int x,y;
    }a[N];
    bool cmpx(Node a,Node b)
    {return a.x<b.x;}
    bool cmpy(Node a,Node b)
    {return a.y<b.y;}
    inline int Abs(int x)
    {return x>0?x:-x;}
    bool judge(int x,int y)
    {
      for(int i=1;i<=n;i++)
        if(a[i].x==x&&a[i].y==y)
          return false;
        else return true;
    }
    int getans(int x,int y)
    {
      int ret=0;
      for(int i=1;i<=n;i++)
        ret+=(Abs(a[i].x-x)+Abs(a[i].y-y));
      return ret;
    }
    int main()
    {
      ios::sync_with_stdio(false);
      cin>>n;
      int x,y;
      for(int i=1;i<=n;i++)
        cin>>a[i].x>>a[i].y;
      if(n%2==1){
        sort(a+1,a+n+1,cmpx);
        x=a[n/2+1].x;
        sort(a+1,a+n+1,cmpy);
        y=a[n/2+1].y;
        ans=N<<2;cnt=0;
        for(int i=0;i<4;i++){
          int X=x+dx[i],Y=y+dy[i];
          int num=getans(X,Y);
          if(num<ans)ans=num,cnt=1;
        else if(num==ans)cnt++;
        }
      }
      else{
        sort(a+1,a+n+1,cmpx);
        int xs=a[n/2].x,xe=a[n/2+1].x;
        sort(a+1,a+n+1,cmpy);
        int ys=a[n/2].y,ye=a[n/2+1].y;
        cnt=(xe-xs+1)*(ye-ys+1);
        for(int i=1;i<=n;i++){
          if(a[i].x>=xs&&a[i].y>=ys&&a[i].x<=xe&&a[i].y<=ye)
        cnt--;
          ans+=(Abs(a[i].x-xs)+Abs(a[i].y-ys));
        }
      }
      cout<<ans<<" "<<cnt<<"
    ";
      return 0;
    }
  • 相关阅读:
    web.xml中 error-page的正确用法
    5.项目数据库设计--人事管理系统
    mod_jk是Apache服务器的一个可插入模块
    jBox使用方法
    ApacheHttpServer出现启动报错:the requested operation has failed解决办法
    ApacheHttpServer修改httpd.conf配置文件
    redis client protocol 分解
    Andorid Async-HttpClient阅览
    HDU-2857-Mirror and Light(计算几何)
    xcode armv6 armv7 armv7s arm64
  • 原文地址:https://www.cnblogs.com/cytus/p/8901608.html
Copyright © 2011-2022 走看看