牛家庄幼儿园为庆祝61儿童节举办庆祝活动,庆祝活动中有一个节目是小朋友们围成一个圆圈跳舞。牛老师挑选出n个小朋友参与跳舞节目,已知每个小朋友的身高h_i。为了让舞蹈看起来和谐,牛老师需要让跳舞的圆圈队形中相邻小朋友的身高差的最大值最小,牛老师犯了难,希望你能帮帮他。
如样例所示:
当圆圈队伍按照100,98,103,105顺时针排列的时候最大身高差为5,其他排列不会得到更优的解
输入包括两行,第一行为一个正整数n(3 ≤ n ≤ 20) 第二行为n个整数h_i(80 ≤ h_i ≤ 140),表示每个小朋友的身高。
输出一个整数,表示满足条件下的相邻小朋友身高差的最大值。
4 100 103 98 105
5
//这个很简单啊!怎么样身高差最小呢?就是两身高差不多的人站一起咯,小时候站队 老师总让 //矮的站中间高的站两边,就是这个道理,如 9 8 7 6 6 7 8 9然后9和9再拉手不就可以了吗 !所以 //将数据输入一个数组如【8 9 7 6 5 4 3 2】然后排序【2 3 4 5 6 7 8 9】然后遍历数组进入 //一个队列一个栈 现规定,索引为0,2,4,,,的依次进入队列Q1,索引为1,3,5,,,,的依次进入//栈S1,就形成一个队列2 4 6 8 (队列尾为8)和一个栈3 5 7 9(栈顶为9) 。然后出栈9 7 5 3 //依次进入队列尾 形成 2 4 6 8 9 7 5 3 就排队成功,2和3拉手就成圈,求每个元素与挨着的 //距离就可以了
所以答案是在如下几项中最大值(已排序):
#include<bits/stdc++.h> using namespace std; int main(){ int n; cin >> n; vector<int> h(n); for (int i = 0; i<n; i++){ cin >> h[i]; } sort(h.begin(), h.end()); int a = h[1] - h[0]; int b = h[n - 1] - h[n - 2]; int maxVal = max(a, b); for (int i = 0; i<n - 2; i++){ int c = h[i + 2] - h[i]; maxVal = max(maxVal, c); } cout<<maxVal; return 0; }
//要想小朋友的身高差尽量小,在升序排好队后,应该让小朋友错位排队
//那么2是放在4与1之间呢,还是3与1之间呢?
//如图,因为4与1的差肯定大于4与2或3与1的差,所以2肯定要排在1与4之间
import java.util.Arrays;import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int[] h=new int[n];
for(int i=0;i<n;i++){
h[i]=in.nextInt();
}
Arrays.sort(h);
int max=Math.max(h[1]-h[0],h[n-1]-h[n-2]);
for(int i=0;i<n-2;i++){
max=Math.max(max, h[i+2]-h[i]);
}
System.out.println(max);
}
}
}
// 思路: 先把所有的身高从大到小排列,分别为0-(n-1),则最大值(n-1)左右分别为(n-2)和(n-3) // 即....(n-4)、(n-2)、(n-1)、(n-3)、(n-5)... 然后最小的两个值围成一圈 import java.util.ArrayList; import java.util.Collections; import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner in = new Scanner(System.in); while (in.hasNextInt()) {//注意while处理多个case int num = in.nextInt(); ArrayList<Integer> heights = new ArrayList<Integer>(); for(int i=0;i<num;i++){ heights.add(in.nextInt()); } Collections.sort(heights); int max = -1; // 倒数第一大 int cha = Math.abs(heights.get(num-1)-heights.get(num-2)); int tmp = num-2; while(tmp>1){ cha = Math.abs(heights.get(tmp)-heights.get(tmp-2)); if(cha>max) max = cha; tmp = tmp-2; } tmp = num-1; while(tmp>1){ cha = Math.abs(heights.get(tmp)-heights.get(tmp-2)); if(cha>max) max = cha; tmp = tmp-2; } cha = Math.abs(heights.get(0)-heights.get(1)); if(cha>max) max = cha; System.out.print(max); } } }
import java.util.*; public class Main{ public static void main(String[] agrs) { Scanner input = new Scanner(System.in); int len = input.nextInt(); input.nextLine(); int[] nums = new int[len]; for(int i = 0; i < len; i++) { nums[i] = input.nextInt(); } Arrays.sort(nums); int pre = nums[1] - nums[0]; int maxDiff = 0; for(int i = 2; i < len; i++) { int cur = nums[i] - nums[i-1]; if(cur + pre > maxDiff) maxDiff = cur + pre; pre = cur; } System.out.println(maxDiff); } }
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.util.Arrays; public class Main{ public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int size = Integer.parseInt(br.readLine()); String height = br.readLine(); String[] hs = height.split(" "); int[] heights = new int[size]; for(int i = 0; i < heights.length; i++){ heights[i] = Integer.parseInt(hs[i]); } System.out.println(handle(heights)); } private static int handle(int[] heights){ Arrays.sort(heights); int max = heights[2] - heights[0]; for(int i = 2; i < heights.length; i++){ int gap = heights[i] - heights[i - 2]; if(gap > max){ max = gap; } } return max; } }
import java.math.BigInteger; import java.util.Arrays; import java.util.Scanner; //System.out.println(""); public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int d=0; int dm=0; int n = sc.nextInt(); int[] array = new int[n]; for(int i=0; i<n; i++){ array[i] = sc.nextInt(); } Arrays.sort(array);//身高排序 for(int i=2;i<n;i+=2){ d=array[i]-array[i-2]; if(d<0)d=-d; if(d>=dm)dm=d; }//dm为第一列最大身高差 for(int i=3;i<n;i+=2){ d=array[i]-array[i-2]; if(d<0)d=-d; if(d>=dm)dm=d; }//dm为第一列和第二列 最大身高差 d=array[0]-array[1]; if(d<0)d=-d; if(d>=dm)dm=d; d=array[n-1]-array[n-2]; if(d<0)d=-d; if(d>=dm)dm=d; //dm为第一列、第二列 、列连接处 最大身高差 System.out.println(dm); } }思路:假如h1 h2 h3 h4 h5 h6 ..hn 依次递增(排序)h1 h2h3 h4h5 h6...hn-1 hn这样形成的圈可以保证身高差的最大值最小。 依次计算 身高差 d 取最大值即可
import java.util.*; public class Main{ public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc=new Scanner(System.in); while(sc.hasNext()){ int n=sc.nextInt(); //小朋友个数; int array[]=new int[n]; int i=0; int maxCount=0; ArrayList <Integer> list=new ArrayList <Integer>(); while(i<n){ array[i]=sc.nextInt(); i++; } Arrays.sort(array); for(int j=0;j<array.length;j++){ if(j%2==0){ list.add(array[j]); } } for(int jj=array.length-1;jj>0;jj--){ if(jj%2!=0){ list.add(array[jj]); } } int arr[]=new int[list.size()]; Iterator <Integer>it=list.iterator(); int index=0; while(it.hasNext()){ arr[index]=it.next(); index++; } maxCount=Math.abs(arr[arr.length-1]-arr[0]); for(int k=1;k<arr.length;k++){ int temp=Math.abs(arr[k]-arr[k-1]); maxCount=(maxCount>temp)?maxCount:temp; } System.out.println(maxCount); } sc.close(); } }
import java.util.*;
public class Celebrate61 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] arr = new int[n];
for (int i = 0; i ; i++) {
arr[i] = scanner.nextInt();
}
Arrays.sort(arr); //先对数组进行排序
//用LinkedList来实现队列的先进先出功能 LinkedList queue = new LinkedList();
Stack stack = new Stack();
for (int i = 0; i ; i++) {
if((i&1) == 0) {
queue.addLast(arr[i]);
}
else stack.push(arr[i]);
}
int size = stack.size();
for(int i = 0; i ; i++) {
queue.addLast(stack.pop());
}
int max = Integer.MIN_VALUE;
for (int i = 1; i ; i++) {
int inter = 0;
if(i == 0) {
inter = Math.abs(queue.get(n-1) - queue.get(0));
}
else {
inter = Math.abs(queue.get(i) - queue.get(i-1));
}
if(max < inter) {
max = inter;
}
}
System.out.println(max);
}
}
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main(int argc, char const *argv[]) { int n; cin>>n; vector<int> height(n,0); for (int i = 0; i < n; ++i) { cin>>height[i]; } sort(height.begin(),height.end()); vector<int> res(n,0); auto itb=res.begin(); auto ite=res.end(); ite--; for(int i=0;i<n;i=i+2){ if(ite==itb){ *ite=height[i]; break; } *itb=height[i]; *ite=height[i+1]; ite--; itb++; } int maxh=abs( res[0]- res[1]); for(int i=2;i<n;i++){ maxh=max(maxh,abs( res[i]- res[i-1])); } cout<<max(maxh,abs( res[0]- res[n-1])); return 0; }
1.将数组排序,如:105 103 100 98 2.排好的数组分为两组:arr1{105,100} arr2{98,103} 3.连接成新数组:105,100,98,103 4.求最大的差值
while(n=readline()){ var arr=readline().split(' '); var allVal=[]; var arr1=[],arr2=[]; arr=arr.sort(function(a,b){ return b-a; }) for(var i=0; i<n; i++){ if(i%2==0) arr1.push(arr[i]); else arr2.unshift(arr[i]); } var res=arr1.concat(arr2); allVal.push(Math.abs(res[0]-res[n-1])); for(var i=1; i<n; i++){ allVal.push(Math.abs(res[i]-res[i-1])); } allVal=allVal.sort(function(a,b){ return b-a; }) print(allVal[0]); }
#排序后以最小值为中心,左边加一个第二小的值,右边家一个第三小的值 #最后计算身高差最大值 def f(n, h_i): h_i.sort(reverse = True) team = [h_i.pop()] n -= 1 while n > 0: team.append(h_i.pop()) n -= 1 if n > 0: team.insert(0, h_i.pop()) n -= 1 ret = [] for i in range(len(team)-1): ret.append(abs(team[i]-team[i+1])) return max(ret) if __name__ == '__main__': while 1: try: n = input() h_i = map(int, raw_input().split()) except: break print f(n, h_i)