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


    时间限制: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)



    例子输入
    1
    3
    1 1
    2 2
    3 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;
    	}
    }
    
    


  • 相关阅读:
    Ubuntu 16 安装redis客户端
    crontab 参数详解
    PHP模拟登录发送闪存
    Nginx配置端口访问的网站
    Linux 增加对外开放的端口
    Linux 实用指令之查看端口开启情况
    无敌的极路由
    不同的域名可以指向同一个项目
    MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error
    Redis 创建多个端口
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/3813233.html
Copyright © 2020-2023  润新知