【编程之美挑战赛第一场】活动中心

来源:互联网 发布:java socketio client 编辑:程序博客网 时间:2024/04/30 09:52
时间限制:12000ms
单点时限:6000ms
内存限制:256MB

描述

A市是一个高度规划的城市,但是科技高端发达的地方,居民们也不能忘记运动和锻炼,因此城市规划局在设计A市的时候也要考虑为居民们建造一个活动中心,方便居住在A市的居民们能随时开展运动,锻炼强健的身心。

城市规划局希望活动中心的位置满足以下条件:

1. 到所有居住地的总距离最小。

2. 为了方便活动中心的资源补给和其他器材的维护,活动中心必须建设在A市的主干道上。


为了简化问题,我们将A市摆在二维平面上,城市的主干道看作直角坐标系平的X轴,城市中所有的居住地都可以看成二维平面上的一个点。

现在,A市的城市规划局希望知道活动中心建在哪儿最好。


输入

第一行包括一个数T,表示数据的组数。

接下来包含T组数据,每组数据的第一行包括一个整数N,表示A市共有N处居住地

接下来N行表示每处居住地的坐标。


输出

对于每组数据,输出一行“Case X: Y”,其中X表示每组数据的编号(从1开始),Y表示活动中心的最优建造位置。我们建议你的输出保留Y到小数点后6位或以上,任何与标准答案的绝对误差或者相对误差在10-6以内的结果都将被视为正确。


数据范围

小数据:1 ≤ T ≤ 1000, 1 ≤ N ≤ 10

大数据:1 ≤ T ≤ 10, 1 ≤ N ≤ 105

对于所有数据,坐标值都是整数且绝对值都不超过106



样例解释

样例1:活动中心的最优建造位置为(1.678787, 0)



样例输入
131 12 23 3
样例输出
Case 1: 1.678787

看了解题思路,三分查找,TT。。特点,求凹函数或者凸函数中的极值点,把公式带入距离,可以观察出总距离和其实是一个凹函数?具体的数学推导给不出,我是个数学渣渣。。

直接看java 代码吧

import java.text.DecimalFormat;import java.util.Arrays;import java.util.Scanner;import java.lang.String;import java.lang.Math;import java.util.HashSet;/*class TreeNode{int val;TreeNode left;TreeNode right;TreeNode(int x) { val = x; left = null; right = null;}}class ListNode{int val;ListNode next;ListNode(int x){val = x; next = null;}}*/public class Solution {static long mode = 1000000007;/*public static void permutation(char[] str, HashSet<String> hashset, int start, int end) {if (start == end) {hashset.add(new String(str));//sum++;}else {for (int i = start; i <= end; i++) {char tmp = str[start];str[start] = str[i];str[i] = tmp;permutation(str, hashset, start+1, end); tmp = str[start];str[start] = str[i];str[i] = tmp;}}}*/public static void main(String[] args) {int T ;Scanner jin = new Scanner(System.in);T = jin.nextInt();for(int i = 0; i < T; i++){int N = jin.nextInt();int[] x_array = new int[N];int[] y_array = new int[N];int minx = 1000000;int maxx = -100000;for (int j = 0; j < N; j++) {x_array[j] = jin.nextInt();y_array[j] = jin.nextInt();if (x_array[j] < minx) {minx = x_array[j];}if (x_array[j] > maxx) {maxx = x_array[j];}}double lo = minx;double hi = maxx;while ((hi-lo) >= 1e-7) {double mid = (lo+hi)/2;double mmid = (mid+hi)/2;double f1 = distance(mid, x_array, y_array);double f2 = distance(mmid, x_array, y_array);if (f1 < f2) {hi = mmid;}else lo = mid;}DecimalFormat df = new DecimalFormat("0.000000");System.out.println("Case " + i + ": " + df.format(lo));}}public static double distance(double x, int[] x_array, int[] y_array) {double dist = 0;for (int i = 0; i < x_array.length; i++) {dist += Math.sqrt((x-x_array[i])*(x-x_array[i]) + y_array[i]*y_array[i]);}return dist;}}


0 0
原创粉丝点击