【POJ 3269】Building A New Barn
2015-09-26 16:05
686 查看
Building A New Barn
Description
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?
Input
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
Output
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.
Sample Input
Sample Output
Hint
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).
Source
USACO 2007 February Gold
很坑爹的一题。
根据题目我们可以知道,就是求一点到其它点的曼哈顿距离总和最小值以及解的个数。
那么我们要知道任意两个点都可以形成一个矩形(也有可能是一条直线),那么这个矩形内任意点到这两个点的曼哈顿距离最小,并且等于这两个点的曼哈顿距离。
而且题目也给出了任意两个点都不相邻,这更是说明了符合上述条件后一定会有解。
其实就是求矩形的交集。(偶数个点)这个问题交给大家思考。
奇数个点的情况要稍微复杂,我们先排出最中间的那个点,然后按上述方法求解,加判断即可。
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 1773 | Accepted: 571 |
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?
Input
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
Output
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.
Sample Input
4 1 -3 0 1 -2 1 1 -1
Sample Output
10 4
Hint
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).
Source
USACO 2007 February Gold
很坑爹的一题。
根据题目我们可以知道,就是求一点到其它点的曼哈顿距离总和最小值以及解的个数。
那么我们要知道任意两个点都可以形成一个矩形(也有可能是一条直线),那么这个矩形内任意点到这两个点的曼哈顿距离最小,并且等于这两个点的曼哈顿距离。
而且题目也给出了任意两个点都不相邻,这更是说明了符合上述条件后一定会有解。
其实就是求矩形的交集。(偶数个点)这个问题交给大家思考。
奇数个点的情况要稍微复杂,我们先排出最中间的那个点,然后按上述方法求解,加判断即可。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct Vertex { int x, y; }v[10005]; int n, left, right, up, down, mid, cost; bool cmp1(Vertex A, Vertex B) { return (A.x < B.x || (A.x == B.x && A.y < B.y)); } bool cmp2(Vertex A, Vertex B) { return A.y < B.y; } int main() { scanf("%d", &n); for (int i = 0; i < n; ++i) scanf("%d%d", &v[i].x, &v[i].y); sort(v, v + n, cmp1); mid = n >> 1; left = v[mid - 1].x; right = v[mid + (n & 1)].x; sort(v, v + (n >> 1), cmp2); sort(v + (n >> 1) + (n & 1), v + n, cmp2); cost = 0; int l = 0, r = n - 1; up = 10005; down = -10005; while (l < r) { cost += abs(v[l].x - v[r].x) + abs(v[l].y - v[r].y); up = min(up, max(v[l].y, v[r].y)); down = max(down, min(v[l].y, v[r].y)); l++; r--; } if (n & 1) { int f = 4; if (v[mid].x >= left && v[mid].x <= right && v[mid].y >= down && v[mid].y <= up) { if (v[mid].x == left) f--; if (v[mid].x == right) f--; if (v[mid].y == up) f--; if (v[mid].y == down) f--; printf("%d %d\n", cost + 1, f); } else { if (down > v[mid].y) { cost += down - v[mid].y; if (left == v[mid].x || right == v[mid].x) cost++; printf("%d 1\n", cost); } else if (up < v[mid].y) { cost += v[mid].y - up; if (left == v[mid].x || right == v[mid].x) cost++; printf("%d 1\n", cost); } } } else { int del = 0; for (int i = 0; i < n; ++i) if (left <= v[i].x && right >= v[i].x && down <= v[i].y && up >= v[i].y) del++; printf("%d %d\n", cost, (right - left + 1) * (up - down + 1) - del); } return 0; }
相关文章推荐
- Java String之String和CharSequence、StringBuilder和StringBuffer的区别
- android-requestFocus EditText 默认获得光标
- chain.doFilter(request,response) 解析
- iOS基础-UIControl及其子类
- iOS开发之UITableView(一)
- 关于UIImageView的显示问题——居中显示或者截取图片的中间部分显示(转)
- NSFetchedResultsController Assertion failure in -[UITableView _endCellAnimationsWithContext:]
- ios 中Nsstirng,Nsdata,char,byte,UIImage 之间的转换
- C#string与stringBuilder的区别
- 重写layoutSubviews
- 如何修改SpriteBuilder中的按钮禁用启用状态
- 如何修改SpriteBuilder中的按钮禁用启用状态
- 如何修改SpriteBuilder中的按钮禁用启用状态
- iOS开发:集合视图 UICollectionView
- 利用break和continue窥探空格输入与回车输入
- Android通用UI开发技术(1)
- General Problem Solving Techniques [Examples]~C
- 第一行代码笔记4(UI)
- web开发性能优化---UI接口章
- SpriteBuilder切换解决方案以及CCB的修改与保存