[USACO07FEB]新牛棚Building A New Barn
# 洛谷题目链接:[[USACO07FEB]新牛棚Building A New Barn](https://www.luogu.org/problemnew/show/P2874)
题目描述
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).
简述一下题意:给出一个二维平面上\(n\)个点.要求出\(ans2\)个点使得这\(ans2\)个点到所有点的曼哈顿距离之和,这\(ans2\)个点不能是原平面直角坐标系中给出的点.两点间曼哈顿距离的公式为\(\left|x-x_i\right|+\left|y-y_i\right|\).
既然要到所有点的曼哈顿距离之和最小,那么可以先设答案点坐标为\((x,y)\).可以得到这样一个式子:
\]
显然我们是要求出一个\((x,y)\)使得\(ans1\)最小,因为\(x\),\(y\)互不影响,所以可以分开处理,那么根据我们的数学知识,可以得知使\(ans1\)最小的值就是\(x\)序列的中位数,同理\(y\)也是序列中的中位数.
这样我们就求出了\(ans1\),但是因为题目的限制,如果\(n\)为奇数时,\(x\)和\(y\)直接求出的中位数有可能是原图中给出的点.所以这时我们要对这个点的上下左右进行判断,对上下左右求一遍最小值.
如果\(n\)为偶数时,那么在\(x[n/2],x[n/2+1],y[n/2],y[n/2+1]\)这四个点所围成的矩形中的所有点都是满足条件的. 先计算出这个矩形中包含的点的个数,然后再将原图中包含的点都一个个删掉.
#include<bits/stdc++.h>
using namespace std;
const int inf=2147483647;
const int N=10000+5;
int n, x[N], y[N], ans1 = inf, ans2 = 0;
int dir[]={0,1,0,-1,0};
struct node{
int x, y;
}p[N];
int gi(){
int ans = 0 , f = 1; char i = getchar();
while(i<'0'||i>'9'){if(i=='-')f=-1;i=getchar();}
while(i>='0'&&i<='9'){ans=ans*10+i-'0';i=getchar();}
return ans * f;
}
int main(){
cin >> n;
for(int i=1;i<=n;i++) x[i] = gi(), y[i] = gi();
for(int i=1;i<=n;i++) p[i].x = x[i], p[i].y = y[i];
sort(x+1 , x+n+1); sort(y+1 , y+n+1);
if(n & 1){
int a = x[n/2+1], b = y[n/2+1], sum = 0;
for(int i=1;i<=n;i++)
sum += abs(a-x[i])+abs(b-y[i]);
ans1 = sum; ans2 = 1;
for(int i=1;i<=n;i++)
if(p[i].x == a && p[i].y == b) ans1 = inf;
for(int i=0;i<4;i++){
int nx = a+dir[i], ny = b+dir[i+1], sum = 0;
for(int i=1;i<=n;i++)
sum += abs(nx-x[i])+abs(ny-y[i]);
if(sum < ans1) ans1 = sum, ans2 = 1;
else if(sum == ans1) ans2++;
}
}
else{
int x1 = x[n/2], x2 = x[n/2+1];
int y1 = y[n/2], y2 = y[n/2+1], sum = 0;
for(int i=1;i<=n;i++)
sum += abs(x1-x[i])+abs(y1-y[i]);
ans1 = min(ans1 , sum);
ans2 = (x2-x1+1)*(y2-y1+1);
for(int i=1;i<=n;i++)
if(x1<=p[i].x && p[i].x<=x2 && y1<=p[i].y && p[i].y<=y2) ans2--;
}
printf("%d %d\n",ans1,ans2);
return 0;
}
[USACO07FEB]新牛棚Building A New Barn的更多相关文章
- 洛谷P2874 [USACO07FEB]新牛棚Building A New Barn [贪心]
题目传送门 题目描述 After scrimping and saving for years, Farmer John has decided to build a new barn. He wan ...
- P2874 [USACO07FEB]新牛棚Building A New Barn
题目描述 After scrimping and saving for years, Farmer John has decided to build a new barn. He wants the ...
- Bzoj 1696: [Usaco2007 Feb]Building A New Barn新牛舍 中位数,数学
1696: [Usaco2007 Feb]Building A New Barn新牛舍 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 394 Solve ...
- 【BZOJ】1696: [Usaco2007 Feb]Building A New Barn新牛舍(贪心)
http://www.lydsy.com/JudgeOnline/problem.php?id=1696 原题要求min(sum{|x-xi|+|y-yi|}),且一定要看题:“没有两头牛的吃草位置是 ...
- bzoj 1696: [Usaco2007 Feb]Building A New Barn新牛舍 ——中位数排序
Description 经过多年的积蓄,农夫JOHN决定造一个新的牛舍.他知道所有N(2 <= N <= 10,000)头牛的吃草位置,所以他想把牛舍造在最方便的地方. 每一头牛吃草的位置 ...
- BZOJ1696: [Usaco2007 Feb]Building A New Barn新牛舍
n<=10000个点(xi,yi),找到一个不同于给出的所有点的点,使得该点到所有点的曼哈顿距离最小并找出这样的点的个数. 第一眼看上去这不是中位数嘛,奇数一个点偶数一片,然后找一下这篇区域有几 ...
- BZOJ 1696 [Usaco2007 Feb]Building A New Barn新牛舍 数学
题意:链接 方法:数学+模拟 解析: 首先这类问题不是第一次见了,所以直接知道拿x的中位数.y的中位数. 这题就是讨论情况很的烦. 题中有个限制,给出待求和的点不能选取. 所以假设奇数个点,求出x中位 ...
- [USACO17JAN]Building a Tall Barn建谷仓
题目描述 Farmer John is building a brand new, NNN -story barn, with the help of his KKK cows ( 1≤N≤K≤101 ...
- TZOJ 1689 Building A New Barn(求平面上有几个其它点求到n个点的曼哈顿距离最小)
描述 After scrimping and saving for years, Farmer John has decided to build a new barn. He wants the b ...
随机推荐
- 详解jQuery中 .bind() vs .live() vs .delegate() vs .on() 的区别
转载自:http://zhuzhichao.com/2013/12/differences-between-jquery-bind-vs-live/ 我见过很多开发者很困惑关于jQuery中的.bin ...
- hive报错:Caused by: ERROR XBM0H: Directory /var/lib/hive/metastore/metastore_db cannot be created.
在cdh集群中,删除之前的hive服务,然后将hive添加到其他节点,然后再通过hive客户端连接hive报错: Caused by: ERROR XJ041: Failed to create da ...
- Hibernate-ORM:12.Hibernate中的多对多关联关系
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客将讲述Hibernate中的多对多关联关系的操作,准备的篇幅较少,望海涵 一,讲述多对多 多对多的关联 ...
- golang log
自带log模块 写入文件 package main import ( "fmt" "log" "os" ) func main(){ log ...
- 怎么防止别人动态在你程序生成代码(怎么防止别人反编译你的app)
1.本地数据加密 iOS应用防反编译加密技术之一:对NSUserDefaults,sqlite存储文件数据加密,保护帐号和关键信息 2.URL编码加密 iOS应用防反编译加密技术之二:对程序中出现的U ...
- .netcore centos环境搭建实战
步骤 1. 安装VMware Workstation 下载地址:https://my.vmware.com/cn/web/vmware/info/slug/desktop_end_user_compu ...
- 「暑期训练」「基础DP」 Monkey and Banana (HDU-1069)
题意与分析 给定立方体(个数不限),求最多能堆叠(堆叠要求上方的方块严格小于下方方块)的高度. 表面上个数不限,问题是堆叠的要求决定了每个方块最多可以使用三次.然后就是对3n" role=& ...
- 通过调用API在JavaWeb项目中实现证件识别
本文详细介绍自己如何在JavaWeb项目中通过调用API实现证件识别. 一,Face++使用简介 二,两种方式(图片URL与本地上传)实现证件识别 一,Face++使用简介 Face++旷视人工智能开 ...
- 在Android上,怎样与Kotlin一起使用Retrofit(KAD21)
作者:Antonio Leiva 时间:Apr 18, 2017 原文链接:https://antonioleiva.com/retrofit-android-kotlin/ 这是又一个例子,关于怎样 ...
- C++ XML文件解析
使用tinyxml2库,git地址https://github.com/leethomason/tinyxml2 只需要使用tinyxml2.h tinyxml2.cpp即可,同时需要using na ...