洛谷P2874 [USACO07FEB]新牛棚Building A New Barn [贪心]
题目描述
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.
输入输出样例
说明
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+;
int n,ans,cnt;
int dx[]={,,,-};
int dy[]={,-,,};
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>?x:-x;}
bool judge(int x,int y)
{
for(int i=;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=;
for(int i=;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=;i<=n;i++)
cin>>a[i].x>>a[i].y;
if(n%==){
sort(a+,a+n+,cmpx);
x=a[n/+].x;
sort(a+,a+n+,cmpy);
y=a[n/+].y;
ans=N<<;cnt=;
for(int i=;i<;i++){
int X=x+dx[i],Y=y+dy[i];
int num=getans(X,Y);
if(num<ans)ans=num,cnt=;
else if(num==ans)cnt++;
}
}
else{
sort(a+,a+n+,cmpx);
int xs=a[n/].x,xe=a[n/+].x;
sort(a+,a+n+,cmpy);
int ys=a[n/].y,ye=a[n/+].y;
cnt=(xe-xs+)*(ye-ys+);
for(int i=;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<<"\n";
return ;
}
洛谷P2874 [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 wants the ...
- [USACO07FEB]新牛棚Building A New Barn
洛谷题目链接:[USACO07FEB]新牛棚Building A New Barn 题目描述 After scrimping and saving for years, Farmer John has ...
- 洛谷——P1821 [USACO07FEB]银牛派对Silver Cow Party
P1821 [USACO07FEB]银牛派对Silver Cow Party 题目描述 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently ...
- 洛谷 [P2701] 巨大的牛棚
首先,本题是一道最大子矩阵问题,且m,n较小,可以使用DP做, 与 洛谷 [P1387]最大正方形 做法相同. #include <iostream> #include <cstdi ...
- 洛谷 P2872 [USACO07DEC]道路建设Building Roads 题解
P2872 [USACO07DEC]道路建设Building Roads 题目描述 Farmer John had just acquired several new farms! He wants ...
- 洛谷P4301 [CQOI2013]新Nim游戏
P4301 [CQOI2013]新Nim游戏 题目描述 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴. ...
- 洛谷 P4301 [CQOI2013]新Nim游戏 解题报告
P4301 [CQOI2013]新Nim游戏 题目描述 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴. ...
- 洛谷 P1606 [USACO07FEB]荷叶塘Lilypad Pond 解题报告
P1606 [USACO07FEB]荷叶塘Lilypad Pond 题目描述 FJ has installed a beautiful pond for his cows' aesthetic enj ...
- 洛谷P2875 [USACO07FEB]牛的词汇The Cow Lexicon
P2875 [USACO07FEB]牛的词汇The Cow Lexicon 题目描述 Few know that the cows have their own dictionary with W ( ...
随机推荐
- android极光推送初步了解
推送可以及时,主动的与用户发起交互 (1)继承jar包,照示例AndroidManifest.xml添加. (2)自定义MyApp继承自Application,在onCreate方法中调用JPushI ...
- spring和Quartz的集群(二)
一:前沿 写完了这两篇才突然想起来,忘记了最关键的东西,那就是在配置文件这里的配置,还有数据库的配置.这是郁闷啊!继续吧! 二:内容配置 我们在集成的时候需要自己配置一个quartz.properti ...
- mysql无法通过ip地址链接
用BitNami搭建个站点(内含mysql数据库服务.phpmyadmin和Apache web Service), 用localhost或127.0.0.1及用户名密码连接没有问题.但是本机或远程通 ...
- [uva11997]k个最小和
一个k*k的矩阵,每行选取一个数相加则得到一个和,求最小的前k个和. k<=750 已知前m行最小的前k个和d[1]…d[k],则前m+1行最小的前k个和都必定是d[i](i<=k)+a[ ...
- Bzoj4710 [Jsoi2011]分特产
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 96 Solved: 62[Submit][Status][Discuss] Description ...
- Apache的Commons Lang和BeanUtils
1.字符串的空判断 //isEmpty System.out.println(StringUtils.isEmpty(null)); // true System.out.println(S ...
- python中filter函数
python中filter()函数 filter()函数是 Python 内置的另一个有用的高阶函数,filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断 ...
- Python阶段复习 - part 3 - Python函数
利用函数打印9*9乘法表 def cheng(num): for i in range(1,num+1): for j in range(1,i+1): print('{0} * {1} = {2}' ...
- python之计算器
开发一个简单的python计算器 1.实现加减乘除及拓号优先级解析 2.用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * ...
- 解决linux下终端无法输入的假死问题
有时在linux下shell终端中,会突然出现终端应用卡死,无法接受键盘输入, 但是其它分屏, 系统都是正常的.这本来是一个终端的很老的功能, 叫软件流控制(XON/XOFF flow control ...