uva 11012 - Cosmic Cabbages
2014-07-16 18:50
375 查看
Problem A
Cosmic Cabbages
Input: Standard Input
Output: Standard Output
Ambrose Bierce
Scientists from the planet Zeelich have figured out a way to grow cabbages in space. They have constructed a huge 3-dimensional steel grid upon which they plant said cabbages. Each cabbage is attached to a corner in
the grid, where 6 steel cables meet and is assigned Cartesian coordinates. A cosmic ant wants to crawl from cabbage X to cabbage Y along the cables that make the grid. The cosmic ant always chooses the shortest possible path along the grid lines while going
from cabbage X to cabbage Y. This distance is called the cosmic distance between two cabbages. Given a collection of cabbages what is the maximum distance between any two of the cabbages?
Input
The first line of input gives the number of cases, N (0<N<21). N test cases follow. Each one starts with a line containing n(2<=n<=105). The next n lines will
each give the 3-dimensional coordinates of a cosmic cabbage (integers in the range[-108, 108]).
Problem setter: Igor Naverniouk, EPS
Special Thanks: Shahriar Manzoor, EPS
I liked this problem so much that I said to myself “If I were the problem setter of this problem?”
n^2是不行的,我开始想到的方法是通过排序,减少每个点需要比较的点的个数。别人有一种更巧的方法是,枚举所有去掉绝对值后的情况。枚举8种情况,k1*x+k2*y+k3*z ,k取正负1。算出每种情况下,每个点对应的k1*x+k2*y+k3*z 值,找出这种情况时的 最大值Max,和最小值Min,ans = max(ans, Max-Min );最后的ans就是答案。对每一种情况下
用 Max-Min 得到的 不一定是那两个点间的距离,是小于等于,因为假如去绝对值的式子 应该是 x1-x2+y1-y2+z1-z2,而某种情况下的式子是 x2-x1+y1-y2+z1-z2,这个式子的值肯定小于前者,因为x2小于x1。然后因为 八种情况 覆盖了所有得到最大值的途径,所以求得的就是最大值。
贴了第一种方法的代码。
Cosmic Cabbages
Input: Standard Input
Output: Standard Output
CABBAGE, n. A familiar kitchen-garden vegetable about as large and wise as a man's head. |
Scientists from the planet Zeelich have figured out a way to grow cabbages in space. They have constructed a huge 3-dimensional steel grid upon which they plant said cabbages. Each cabbage is attached to a corner in
the grid, where 6 steel cables meet and is assigned Cartesian coordinates. A cosmic ant wants to crawl from cabbage X to cabbage Y along the cables that make the grid. The cosmic ant always chooses the shortest possible path along the grid lines while going
from cabbage X to cabbage Y. This distance is called the cosmic distance between two cabbages. Given a collection of cabbages what is the maximum distance between any two of the cabbages?
Input
The first line of input gives the number of cases, N (0<N<21). N test cases follow. Each one starts with a line containing n(2<=n<=105). The next n lines will
each give the 3-dimensional coordinates of a cosmic cabbage (integers in the range[-108, 108]).
Output
For each test case, output one line containing "Case #x:" followed by the largest cosmic distance between cabbages X and Y, out of all possible choices of X and Y.Sample Input Output for Sample Input
4 2 1 1 1 2 2 2 3 0 0 0 0 0 1 1 1 0 4 0 1 2 3 4 5 6 7 8 9 10 11 6 0 0 0 1 1 1 2 2 2 0 0 1 1 0 0 0 1 0 | Case #1: 3 Case #2: 3 Case #3: 27 Case #4: 6 |
Special Thanks: Shahriar Manzoor, EPS
I liked this problem so much that I said to myself “If I were the problem setter of this problem?”
n^2是不行的,我开始想到的方法是通过排序,减少每个点需要比较的点的个数。别人有一种更巧的方法是,枚举所有去掉绝对值后的情况。枚举8种情况,k1*x+k2*y+k3*z ,k取正负1。算出每种情况下,每个点对应的k1*x+k2*y+k3*z 值,找出这种情况时的 最大值Max,和最小值Min,ans = max(ans, Max-Min );最后的ans就是答案。对每一种情况下
用 Max-Min 得到的 不一定是那两个点间的距离,是小于等于,因为假如去绝对值的式子 应该是 x1-x2+y1-y2+z1-z2,而某种情况下的式子是 x2-x1+y1-y2+z1-z2,这个式子的值肯定小于前者,因为x2小于x1。然后因为 八种情况 覆盖了所有得到最大值的途径,所以求得的就是最大值。
贴了第一种方法的代码。
#include<cstdio> #include<map> #include<queue> #include<cstring> #include<iostream> #include<cstring> #include<algorithm> #include<vector> using namespace std; const int maxn = 100000 + 5; const int INF = 1000000000; typedef long long LL; typedef pair<int, int> P; struct Node{ int x, y, z; }a[maxn]; bool cmp1(Node a, Node b){ return a.x+a.y+a.z < b.x+b.y+b.z; } bool cmp2(Node a, Node b){ return a.x+a.y-a.z < b.x+b.y-b.z; } bool cmp3(Node a, Node b){ return a.x-a.y+a.z < b.x-b.y+b.z; } bool cmp4(Node a, Node b){ return -a.x+a.y+a.z < -b.x+b.y+b.z; } bool cmp5(Node a, Node b){ return a.x-a.y-a.z < b.x-b.y-b.z; } bool cmp6(Node a, Node b){ return -a.x+a.y-a.z < -b.x+b.y-b.z; } bool cmp7(Node a, Node b){ return -a.x-a.y+a.z < -b.x-b.y+b.z; } bool cmp8(Node a, Node b){ return -a.x-a.y-a.z < -b.x-b.y-b.z; } int main(){ int t, kase = 0; scanf("%d", &t); while(t--){ kase++; int n; scanf("%d", &n); for(int i = 0;i < n;i++){ scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].z); } int ans = 0; sort(a, a+n, cmp1); for(int i = 0;i < n;i++){ for(int j = n-1;j >= 0;j--){ if(a[j].x>a[i].x && a[j].y>a[i].y && a[j].z>a[i].z){ ans = max(ans, a[j].x-a[i].x+a[j].y-a[i].y+a[j].z-a[i].z); break; } } } sort(a, a+n, cmp2); for(int i = 0;i < n;i++){ for(int j = n-1;j >= 0;j--){ if(a[j].x>a[i].x && a[j].y>a[i].y && a[j].z<a[i].z){ ans = max(ans, a[j].x-a[i].x+a[j].y-a[i].y-(a[j].z-a[i].z)); break; } } } sort(a, a+n, cmp3); for(int i = 0;i < n;i++){ for(int j = n-1;j >= 0;j--){ if(a[j].x>a[i].x && a[j].y<a[i].y && a[j].z>a[i].z){ ans = max(ans, a[j].x-a[i].x-(a[j].y-a[i].y)+a[j].z-a[i].z); break; } } } sort(a, a+n, cmp4); for(int i = 0;i < n;i++){ for(int j = n-1;j >= 0;j--){ if(a[j].x<a[i].x && a[j].y>a[i].y && a[j].z>a[i].z){ ans = max(ans, -(a[j].x-a[i].x)+a[j].y-a[i].y+a[j].z-a[i].z); break; } } } sort(a, a+n, cmp5); for(int i = 0;i < n;i++){ for(int j = n-1;j >= 0;j--){ if(a[j].x>a[i].x && a[j].y<a[i].y && a[j].z<a[i].z){ ans = max(ans, a[j].x-a[i].x-(a[j].y-a[i].y)-(a[j].z-a[i].z)); break; } } } sort(a, a+n, cmp6); for(int i = 0;i < n;i++){ for(int j = n-1;j >= 0;j--){ if(a[j].x<a[i].x && a[j].y>a[i].y && a[j].z<a[i].z){ ans = max(ans, -(a[j].x-a[i].x)+a[j].y-a[i].y-(a[j].z-a[i].z)); break; } } } sort(a, a+n, cmp7); for(int i = 0;i < n;i++){ for(int j = n-1;j >= 0;j--){ if(a[j].x<a[i].x && a[j].y<a[i].y && a[j].z>a[i].z){ ans = max(ans, -(a[j].x-a[i].x)-(a[j].y-a[i].y)+a[j].z-a[i].z); break; } } } sort(a, a+n, cmp8); for(int i = 0;i < n;i++){ for(int j = n-1;j >= 0;j--){ if(a[j].x<a[i].x && a[j].y<a[i].y && a[j].z<a[i].z){ ans = max(ans, -(a[j].x-a[i].x+a[j].y-a[i].y+a[j].z-a[i].z)); break; } } } printf("Case #%d: %d\n", kase, ans); } return 0; }
相关文章推荐
- uva 11012——Cosmic Cabbages
- UVa 11012 - Cosmic Cabbages (机智地枚举)
- UVa:11012 Cosmic Cabbages
- UVA 11012 - Cosmic Cabbages(枚举技巧)
- uva 11012 - Cosmic Cabbages(暴力)
- UVA 442 矩阵链乘
- UVa 524 - Prime Ring Problem
- UVa 10107 - What is the Median?
- UVA 617 - Nonstop Travel(数论+暴力枚举)
- uva 10808 - Rational Resistors(基尔霍夫定律+高斯消元)
- UVa 1585 - Score
- UVA662- Fast Food
- uva 1658(最小费用最大流)
- UVA - 414 Machined Surfaces
- uva11584 Partitioning by Palindromes
- Uva 11520 填充正方形
- uva 10050 Hartals
- UVA 165 邮票
- uva11039 - Building designing
- uva 11997 - K Smallest Sums