【HackerRank】Sherlock and MiniMax
题目连接: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的更多相关文章
- 【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 ...
- 【HackerRank】 Sherlock and The Beast
Sherlock and The Beast Sherlock Holmes is getting paranoid about Professor Moriarty, his archenemy. ...
- 【HackerRank】How Many Substrings?
https://www.hackerrank.com/challenges/how-many-substrings/problem 题解 似乎是被毒瘤澜澜放弃做T3的一道题(因为ASDFZ有很多人做过 ...
- 【HackerRank】Running Time of Quicksort
题目链接:Running Time of Quicksort Challenge In practice, how much faster is Quicksort (in-place) than I ...
- 【hackerrank】Week of Code 30
Candy Replenishing Robot Find the Minimum Number 直接模拟 Melodious password dfs输出方案 Poles 题意:有多个仓库,只能从后 ...
- 【hackerrank】Week of Code 26
在jxzz上发现的一个做题网站,每周都有训练题,题目质量……前三题比较水,后面好神啊,而且类型差不多,这周似乎是计数专题…… Army Game 然后给出n*m,问需要多少个小红点能全部占领 解法:乘 ...
- 【HackerRank】Median
题目链接:Median 做了整整一天T_T 尝试了各种方法: 首先看了解答,可以用multiset,但是发现java不支持: 然后想起来用堆,这个基本思想其实很巧妙的,就是维护一个最大堆和最小堆,最大 ...
- 【HackerRank】Coin on the Table
题目链接:Coin on the Table 一开始想用DFS做的,做了好久都超时. 看了题解才明白要用动态规划. 设置一个三维数组dp,其中dp[i][j][k]表示在时间k到达(i,j)所需要做的 ...
- 【HackerRank】Pairs
题目链接:Pairs 完全就是Two Sum问题的变形!Two Sum问题是要求数组中和正好等于K的两个数,这个是求数组中两个数的差正好等于K的两个数.总结其实就是“骑驴找马”的问题:即当前遍历ar[ ...
随机推荐
- Mybatis 逆向工程 自动生成代码
Mybatis 可以通过一定的代码,自动生成包括mapper.xml.mapper.java.po等文件: 一.环境准备: 用到的JAR包如下: 文件只有两个:GenMain.java和generat ...
- Mysql5.5 慢查询 trace的配置(转,针对5.5)
1. 慢查询有什么用? 它能记录下所有执行超过long_query_time时间的SQL语句, 帮你找到执行慢的SQL, 方便我们对这些SQL进行优化. 2. 如何开启慢查询? 首先我们先查看MYSQ ...
- Map Hashtable Hashmap 集合四
Map是通过键值对来唯一标识的,所以不能重复 存相同键值对 Hashtable存的是键值对 Hashtable<key,value> key,value 都不能为null 方法get(); ...
- 部署vuejs dist文件,通过node.js编译
前期准备: 1. Linux环境,安装配置node.js ① 下载地址:http://nodejs.cn/download/ ,下载linux 64位 ② 已编译好的压缩包,解压到指定目录 cd / ...
- 华盟网公开课 office 宏 主讲Alex
powershell github: veil-evasion macroshop unicorn https://github.com/trustedsec/unicorn metasploit ...
- diy 重要的不是这个工具怎么解决了问题
w 0-这个工具解决了什么问题? 1-diy,怎么解决这个工具解决了的问题? 2-是否diy实现?实现了,对比,优化:反之,分析借鉴,吸收优化. 重要的不是git怎样解决了git已经解决的问题.
- SQL SERVER临时表的使用
SQL SERVER临时表的使用 drop table #Tmp --删除临时表#Tmpcreate table #Tmp --创建临时表#Tmp( ID int IDENTITY (1 ...
- Django中间件,信号,缓存
中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 在django项 ...
- 我的Android进阶之旅------>Android横竖屏切换总结
在默认情况下当屏幕从竖评变到横屏时会触发 onConfigurationChanged 事件 在默认情况下会重新加载画面并显示和横屏一样的画面,这样会有2个问题, * 布局问题,在竖屏 显示的布局 ...
- matlab学习笔记之求解线性规划问题和二次型问题
一.线性规划问题 已知目标函数和约束条件均为线性函数,求目标函数的最小值(最优值)问题. 1.求解方式:用linprog函数求解 2.linprog函数使用形式: x=linprog(f,A,b) ...