POJ 3714 Raid
2015-09-24 14:25
453 查看
#include <stdio.h> #include <math.h> #define MAX 100001 #define INF (1e+11) struct POINT{ double x; double y; int isAgent; }; int numOfStationsOrAgents; POINT pointArray[MAX * 2]; int numOfPoints; int indexOfPoint; POINT leftMidPointArray[MAX]; int numOfLeftMidPoints; int indexOfLeftMidPoint; POINT rightMidPointArray[MAX]; int numOfRightMidPoints; int indexOfRightMidPoint; void pointCopy(POINT *to, POINT *from){ to->x = from->x; to->y = from->y; to->isAgent = from->isAgent; } void sortPointsAccordingToX(int start, int end){ if (start >= end){ return; } while (start < end){ int left = start; int right = end; POINT pivotPoint; pointCopy(&pivotPoint, &pointArray[start]); double pivotX = pivotPoint.x; while (left < right){ while (left < right && pointArray[right].x >= pivotX){ right--; } pointCopy(&pointArray[left], &pointArray[right]); while (left < right && pointArray[left].x <= pivotX){ left++; } pointCopy(&pointArray[right], &pointArray[left]); } pointCopy(&pointArray[left], &pivotPoint); int pivot = left; sortPointsAccordingToX(start, pivot - 1); start = pivot + 1; } } double getDist(POINT from, POINT to){ if (from.isAgent == to.isAgent){ return INF; } double deltaX = from.x - to.x; double deltaY = from.y - to.y; return sqrt(deltaX * deltaX + deltaY * deltaY); } double getMinDist(int left, int right){ double minDist = INF; if (left == right){ return minDist; } if (left + 1 == right){ return getDist(pointArray[left], pointArray[right]); } int mid = (left + right) >> 1; double leftMinDistSquare = getMinDist(left, mid); double rightMinDistSquare = getMinDist(mid + 1, right); minDist= (leftMinDistSquare < rightMinDistSquare ? leftMinDistSquare : rightMinDistSquare); numOfLeftMidPoints = 0; for (indexOfPoint = mid; indexOfPoint >= left; indexOfPoint--){ double deltaX = pointArray[mid].x - pointArray[indexOfPoint].x; if ( deltaX < minDist){ ++numOfLeftMidPoints; pointCopy(&leftMidPointArray[numOfLeftMidPoints], &pointArray[indexOfPoint]); } } numOfRightMidPoints = 0; for (indexOfPoint = mid; indexOfPoint <= right; indexOfPoint++){ double deltaX = pointArray[indexOfPoint].x - pointArray[mid].x; if ( deltaX < minDist){ ++numOfRightMidPoints; pointCopy(&rightMidPointArray[numOfRightMidPoints], &pointArray[indexOfPoint]); } } for (indexOfLeftMidPoint = 1; indexOfLeftMidPoint <= numOfLeftMidPoints; indexOfLeftMidPoint++){ for (indexOfRightMidPoint = 1; indexOfRightMidPoint <= numOfRightMidPoints; indexOfRightMidPoint++){ double dist = getDist( leftMidPointArray[indexOfLeftMidPoint], rightMidPointArray[indexOfRightMidPoint]); if (dist < minDist){ minDist = dist; } } } return minDist; } int main(){ //freopen("input.txt", "r", stdin); int numOfTestCases; scanf("%d", &numOfTestCases); while (numOfTestCases--){ scanf("%d", &numOfStationsOrAgents); numOfPoints = numOfStationsOrAgents * 2; for (indexOfPoint = 1; indexOfPoint <= numOfStationsOrAgents; indexOfPoint++){ scanf("%lf %lf", &pointArray[indexOfPoint].x, &pointArray[indexOfPoint].y); pointArray[indexOfPoint].isAgent = 0; } for ( ; indexOfPoint <= numOfPoints; indexOfPoint++){ scanf("%lf %lf", &pointArray[indexOfPoint].x, &pointArray[indexOfPoint].y); pointArray[indexOfPoint].isAgent = 1; } sortPointsAccordingToX(1, numOfPoints); printf("%.3f\n", getMinDist(1, numOfPoints) ); } return 0; }
相关文章推荐
- 硬件RAID解决方案与RAID组建过程详解
- 使用 mdadm 管理 RAID 阵列
- 如何在linux下做软raid实现方法
- 在Linux下用软件实现RAID功能的实现方法
- DELL R900 服务器 RAID阵列 配置详解
- RAID制作教程图文详解
- 教你安装磁盘阵列:组建RAID需要几块硬盘
- Raid教程 全程图解手把手教你做RAID
- 磁盘阵列(DiskArray)原理
- Storage Networks Explained (1)
- RAID驱动器状态描述
- 什么是raid的background initialization?
- RAID 监控Megacli
- RAID0,RAID1,RAID5原理介绍
- 在Windows 2003下创建软RAID完全手册
- 低端服务器上大容量SATA硬盘的RAID问题
- RAID详解
- RAID原理详解
- 在Windows server2003下创建软RAID完全手册
- DELL服务器 RAID 配置详解