平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小。
2018-02-25 10:43
387 查看
题目:平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小。
源码如下:
源码如下:
#include <iostream> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <time.h> #include <math.h> #define N 1005 #define eps 1e-8 //搜索停止条件阀值 #define INF 1e99 #define delta 0.98 //温度下降速度 #define T 100 //初始温度 using namespace std; int dx[4] = {0, 0, -1, 1}; int dy[4] = {-1, 1, 0, 0}; //上下左右四个方向 struct Point { double x, y; }; Point s , t ; double cross(Point A, Point B, Point C) { return (B.x - A.x) * (C.y - A.y) - (B.y - A.y) * (C.x - A.x); } double multi(Point A, Point B, Point C) { return (B.x - A.x) * (C.x - A.x) + (B.y - A.y) * (C.y - A.y); } double dist(Point A, Point B) { return sqrt((A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y)); } double GetDist(Point A, Point B, Point C) { if(dist(A, B) < eps) return dist(B, C); if(multi(A, B, C) < -eps) return dist(A, C); if(multi(B, A, C) < -eps) return dist(B, C); return fabs(cross(A, B, C) / dist(A, B)); } double GetSum(Point s[], Point t[], int n, Point o) { double ans = 0; while(n--) ans += GetDist(s , t , o); return ans; } double Search(Point s[], Point t[], int n, Point &o) { o = s[0]; double tem = T; double ans = INF; while(tem > eps) { bool flag = 1; while(flag) { flag = 0; for(int i = 0; i < 4; i++) //上下左右四个方向 { Point z; z.x = o.x + dx[i] * tem; z.y = o.y + dy[i] * tem; double tp = GetSum(s, t, n, z); if(ans > tp) { ans = tp; o = z; flag = 1; } } } tem *= delta; } return ans; } int main() { int n; while(scanf("%d", &n) != EOF) { for(int i = 0; i < n; i++) scanf("%lf %lf %lf %lf", &s[i].x, &s[i].y, &t[i].x, &t[i].y); Point o; double ans = Search(s, t, n, o); printf("%.1lf %.1lf %.1lf\n", o.x, o.y, ans); } return 0; }
相关文章推荐
- 给定一个集合和一个数找出比这个数大的最小的数
- 给定任意一个整数,找出比当前这个数大的最小的10个素数之和。
- 给定数轴上n个点,找出其中一个点使其到其他各个点距离之和最小。
- 任意给定一个大于等于10的整数A,请写一程序,以最小的时间复杂度找出比A小并且最接近A的一个整数B。要求:A的每位之和与B的每位之和相等 例:如果A=123 那么B=114
- 一棵排序二叉树,令 f=(最大值+最小值)/2, 设计一个算法,找出距离f 值最近、大于f 值的结点。 复杂度如果是O(n2)则不得分
- 9.11排序与查找(三)——给定一个排序后的数组,包含n个整数,但这个数组已被旋转过多次,找出数组中的某个元素
- 给定一个整数序列,请找出这个整数序列的中间数的值。
- 给定一个整数序列,请找出这个整数序列的中间数的值。
- 2014年去哪儿网笔试题--给定一个整型数组,对这个整型数组排序,使得按序拼接数组各元素得到的值最小。
- 最近距离 已知平面上的若干点的位置,存入一个List中。现在需要计算所有这些点中,距离最近的两个点间的最小距离
- 给定一个整数序列,请找出这个整数序列的中间数的值。
- 给定一个字符串列表,找出单词中最长单词,可以用l列表中的其他单词一次构建一个字符。返回具有最小字典顺序的最长单词。
- 用C++编程 输入10个数字,放在一个数组中,找出其中最小的值,输出这个值以及它在数组中的下标
- 给定一个数组,找出数组缺少的最小的正整数
- (百度笔试题)给定任意一个正整数,求比这个数大且最小的“不重复数”。
- 100亿个无序数,给定里面其中一个数A,找出与A大小相差最小的各10个数
- 整型数组处理算法(九)给定任意一个正整数,求比这个数大且最小的“不重复数”[2014百度笔试题]
- 整型数组处理算法(九)给定任意一个正整数,求比这个数大且最小的“不重复数”(性能优化)[2014百度笔试题]
- 【算法】(遇到的问题)给定一个数组,找出不在数组中的最小的那个数字
- 一棵排序二叉树,令 f=(最大值+最小值)/2,设计一个算法,找出距离f值最近、大于f值的结点。 复杂度如果是O(n2)则不得分。