题目连接:Sherlock and MiniMax

Watson gives Sherlock an array A1,A2...AN
He asks him to find an integer M between P and Q(both inclusive), such that, min {|Ai-M|, 1 ≤ i ≤ N} is maximised. If there are multiple solutions, print the smallest one.

Input Format 
The first line contains N. The next line contains space separated N integers, and denote the array A. The third line contains two space separated integers denoting P and Q.

Output Format 
In one line, print the required answer.

Constraints 
1 ≤ N ≤ 102
1 ≤ Ai ≤ 109 
1 ≤ P ≤ Q ≤ 109

Sample Input

3
5 8 14
4 9

Sample Output

4

题解:难度为Diffcult的一道题,真的好难=。=

首先题目理解:给定一个数组a和两个整数P和Q,在区间[P,Q]中找到一个数M,使得min{a[i] - M}最大,即对于每一个[P,Q]之间的数m,将数组中的每个数和m求差的绝对值,那么这些绝对值里面就有一个最小值(比如题目中的例子,选择m=4,那么对应的3个差的绝对值是1,4,10,最小值就是1)。现在要做的就是选出这个m,使得这个最小值最大(比如如果选定m=5,那么对应的3个差的绝对值是0,3,9,最小值是0,就比刚才选4的时候得到的最小值小,所以m选4不选5)。

首先对原数组排序,那么对于[P,Q]之间的任意一个m,对应的差的绝对值如下图两种情况所示:

图一

在第一种情况中,最小值在端点处达到;在第二种情况中,最小值在转折点处达到,这都是由a数组有序以后得到的性质。那么我们想想在哪些地方可以达到最大的最小值。如小图所示,对于任意两个数,当且仅当取m为它们的中点(a[i]+a[i+1])/2的时候,得到的最小绝对值最大。所以就可以遍历所有的(a[i],a[i+1]),然后找出使得最小值最大的m作为M。

图二

在这个过程中,有一种情况就是(a[i],a[i+1])的中点不在[P,Q]内,那么最小值或者在[P,Q]中最靠近中点处取得(区间[P,Q]和区间[a[i],a[i+1]]有交集时候,在P或者Q取到最小值);或者[P,Q]和[a[i],a[i+1]]没有交集,即图一中第一种情况,最小值也在P或者Q处达到。那么我们为单独用O(n)的时间考察P和Q,遍历数组,找到最小值,然后查看是否可能成为最大的最小值。

总结一下算法:

  • 首先对数组a排序
  • 对于P和Q,利用O(N)的时间遍历数组,找到最小值,看能够成为最大的最小值;
  • 对于任意(a[i],a[i+1]),考察(a[i]+a[i+1])/2是否在[P,Q]内,如果在,考察此处得到的最小值是否能够成为最大的最小值,注意a[i]+a[i+1]为奇数时,要考察两个中点,它们都可能取得最小值。
  • 算法排序时间复杂度O(NlogN),单独处理P,Q及中点复杂度O(N),所以最终的算法时间复杂度为O(NlogN)。

代码如下:

 import java.io.*;
import java.util.*;
import java.math.*; public class Solution {
static int miniMax = 0;
static int miniMax_index = 0;
private static int mini_first_last(int[] a,int first_last){
//check for p
int mini = Integer.MAX_VALUE; for(int i = 0;i < a.length;i++){
mini = Math.min(mini,Math.abs(a[i]-first_last));
} return mini;
}
private static void middle(int index,int[] a,int p,int q){
int mini = Integer.MAX_VALUE;
int mini_index = 0;
int mid = (a[index]+a[index+1])/2;
if(mid >= p && mid <= q){
int m = Math.abs(a[index]-mid);
int n = Math.abs(a[index+1]-mid);
if(mini > Math.min(m, n)){
mini = Math.min(m, n);
mini_index = mid;
}
if(mid+1<=q && mid*2 != a[index] + a[index+1]){
m = Math.abs(a[index]-mid-1);
n = Math.abs(a[index+1]-mid-1);
if(mini > Math.min(m, n)){
mini = Math.min(m, n);
mini_index = mid+1;
}
}
if(mini != Integer.MAX_VALUE && miniMax < mini){
miniMax = mini;
miniMax_index = mini_index;
}
} }
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] a = new int[n];
for(int i = 0;i < n;i++)
a[i] = in.nextInt();
int p = in.nextInt();
int q = in.nextInt();
Arrays.sort(a); miniMax = mini_first_last(a, p);
miniMax_index = p; int temp = mini_first_last(a, q);
if(miniMax < temp){
miniMax = temp;
miniMax_index = q;
} for(int i = 0;i < n-1;i++){
middle(i, a, p, q);
}
System.out.println(miniMax_index);
}
}

【HackerRank】Sherlock and MiniMax的更多相关文章

  1. 【HackerRank】Sherlock and Array

    Watson gives an array A1,A2...AN to Sherlock. Then he asks him to find if there exists an element in ...

  2. 【HackerRank】 Sherlock and The Beast

    Sherlock and The Beast Sherlock Holmes is getting paranoid about Professor Moriarty, his archenemy. ...

  3. 【HackerRank】How Many Substrings?

    https://www.hackerrank.com/challenges/how-many-substrings/problem 题解 似乎是被毒瘤澜澜放弃做T3的一道题(因为ASDFZ有很多人做过 ...

  4. 【HackerRank】Running Time of Quicksort

    题目链接:Running Time of Quicksort Challenge In practice, how much faster is Quicksort (in-place) than I ...

  5. 【hackerrank】Week of Code 30

    Candy Replenishing Robot Find the Minimum Number 直接模拟 Melodious password dfs输出方案 Poles 题意:有多个仓库,只能从后 ...

  6. 【hackerrank】Week of Code 26

    在jxzz上发现的一个做题网站,每周都有训练题,题目质量……前三题比较水,后面好神啊,而且类型差不多,这周似乎是计数专题…… Army Game 然后给出n*m,问需要多少个小红点能全部占领 解法:乘 ...

  7. 【HackerRank】Median

    题目链接:Median 做了整整一天T_T 尝试了各种方法: 首先看了解答,可以用multiset,但是发现java不支持: 然后想起来用堆,这个基本思想其实很巧妙的,就是维护一个最大堆和最小堆,最大 ...

  8. 【HackerRank】Coin on the Table

    题目链接:Coin on the Table 一开始想用DFS做的,做了好久都超时. 看了题解才明白要用动态规划. 设置一个三维数组dp,其中dp[i][j][k]表示在时间k到达(i,j)所需要做的 ...

  9. 【HackerRank】Pairs

    题目链接:Pairs 完全就是Two Sum问题的变形!Two Sum问题是要求数组中和正好等于K的两个数,这个是求数组中两个数的差正好等于K的两个数.总结其实就是“骑驴找马”的问题:即当前遍历ar[ ...

随机推荐

  1. Mybatis 逆向工程 自动生成代码

    Mybatis 可以通过一定的代码,自动生成包括mapper.xml.mapper.java.po等文件: 一.环境准备: 用到的JAR包如下: 文件只有两个:GenMain.java和generat ...

  2. Mysql5.5 慢查询 trace的配置(转,针对5.5)

    1. 慢查询有什么用? 它能记录下所有执行超过long_query_time时间的SQL语句, 帮你找到执行慢的SQL, 方便我们对这些SQL进行优化. 2. 如何开启慢查询? 首先我们先查看MYSQ ...

  3. Map Hashtable Hashmap 集合四

    Map是通过键值对来唯一标识的,所以不能重复 存相同键值对 Hashtable存的是键值对 Hashtable<key,value> key,value 都不能为null 方法get(); ...

  4. 部署vuejs dist文件,通过node.js编译

    前期准备: 1. Linux环境,安装配置node.js ① 下载地址:http://nodejs.cn/download/  ,下载linux 64位 ② 已编译好的压缩包,解压到指定目录 cd / ...

  5. 华盟网公开课 office 宏 主讲Alex

    powershell github: veil-evasion macroshop   unicorn https://github.com/trustedsec/unicorn metasploit ...

  6. diy 重要的不是这个工具怎么解决了问题

    w 0-这个工具解决了什么问题? 1-diy,怎么解决这个工具解决了的问题? 2-是否diy实现?实现了,对比,优化:反之,分析借鉴,吸收优化. 重要的不是git怎样解决了git已经解决的问题.

  7. SQL SERVER临时表的使用

    SQL SERVER临时表的使用 drop table #Tmp   --删除临时表#Tmpcreate table #Tmp --创建临时表#Tmp(    ID   int IDENTITY (1 ...

  8. Django中间件,信号,缓存

    中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 在django项 ...

  9. 我的Android进阶之旅------>Android横竖屏切换总结

    在默认情况下当屏幕从竖评变到横屏时会触发 onConfigurationChanged 事件 在默认情况下会重新加载画面并显示和横屏一样的画面,这样会有2个问题,   * 布局问题,在竖屏 显示的布局 ...

  10. matlab学习笔记之求解线性规划问题和二次型问题

    一.线性规划问题 已知目标函数和约束条件均为线性函数,求目标函数的最小值(最优值)问题. 1.求解方式:用linprog函数求解 2.linprog函数使用形式: x=linprog(f,A,b)  ...