华为上机题之输出身高差值最小的俩个人

要从5个人中选取2个人作为礼仪,其中每个人的身高范围为160-190,要求2个人的身高差值最小(如果差值相同的话,选取其中最高的两人),以升序输出两个人的身高。

 Smple     input:161 189 167 172 188

Sample outPut: 188 189

分析:

看到这个题,最小想到的全排问题,从5个人中抽2个人出来,一共有10中情况。计算出来后,马上想到的是用排序来这10种情况的差值,选取差值最小那一组的俩个人。

接下来想到的是用什么数据结构。每一种情况需要存储a、b两个人的编号、俩个人的差值。很显然,数组是搞不定的啦。

我的思路是这个样子滴,自定义一个类Model,里面装了a、b两个得编号,和他们的差值。让他们实现了comparable接口。接下来,我用了TreeSet结构,将Model插进去,让TreeSet帮我们排序。这里有个小技巧,实现comparable接口时,故意将大小的次序跌倒,这样TreeSet中的对象,差值最小的在最前面。

代码:

public class JinZhi
{
	static class Model implements Comparable<Model>
	{
		int a;
		int b;
		int min;//a、b两个人的身高差值
		public Model(int a, int b, int min)
		{
			this.a=a;
			this.b=b;
			this.min=min;
		}
		@Override
		public int compareTo(Model o)
		{
			// TODO Auto-generated method stub
			if (this.min<o.min)
			{
				return -1;
			}
			else {
				return 1;
			}
		}	

		@Override
		public String toString()
		{
			// TODO Auto-generated method stub
			return a+" "+b+" "+min;
		}
	}
	public static void main(String[] args)
	{
		Scanner scanner=new Scanner(System.in);
		int[] a=new int[5];
		int i=0;
		while(i<5&&scanner.hasNextInt())
		{
			a[i++]=scanner.nextInt();
		}

		TreeSet<Model> treeSet=new TreeSet<>();
		for (int j = 0; j < a.length; j++)
		{
			for (int k = j+1; k < a.length; k++)
			{
				treeSet.add(new Model(j, k, Math.abs(a[j]-a[k])));
			}
		}

		Iterator<Model> iterator=treeSet.iterator();
		int max_1=0;
		int max_2=0;
		int min=0;
		while(iterator.hasNext())
		{
			Model tempModel=iterator.next();
			if (min==0)
			{
				if (a[tempModel.a]>max_1)
				{
					max_2=max_1;
					max_1=a[tempModel.a];
				}
				else if (a[tempModel.a]<max_1&&a[tempModel.a]>max_2){
					max_2=a[tempModel.a];
				}

				if (a[tempModel.b]>max_1)
				{
					max_2=max_1;
					max_1=a[tempModel.b];
				}
				else if (a[tempModel.b]<max_1&&a[tempModel.b]>max_2){
					max_2=a[tempModel.b];
				}
				min=tempModel.min;
			}
			else if(tempModel.min==min)
			{
				if (a[tempModel.a]>max_1)
				{
					max_2=max_1;
					max_1=a[tempModel.a];
				}
				else if (a[tempModel.a]<max_1&&a[tempModel.a]>max_2){
					max_2=a[tempModel.a];
				}

				if (a[tempModel.b]>max_1)
				{
					max_2=max_1;
					max_1=a[tempModel.b];
				}
				else if (a[tempModel.b]<max_1&&a[tempModel.b]>max_2){
					max_2=a[tempModel.b];
				}
			}
			else
				break;
		}
		System.out.println(max_2+" "+max_1);
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-29 13:02:07

华为上机题之输出身高差值最小的俩个人的相关文章

求2个人的身高差值最小

要从5个人中选取2个人作为礼仪,其中每个人的身高范围为160-190,要求2个人的身高差值最小(如果差值相同的话,选取其中最高的两人),以升序输出两个人的身高. 例: 输入:161 189 167 172 188  输出:188 189

华为上机题汇总(七)

华为上机题汇总(七) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总七 目录 第三十一题 第三十二题 第三十三题 第三十四题 第三十五题 第三十一题 已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的.经过的站点名分别如下,两条线交叉的换乘点用T1.T2表示.编写程序,任意输入两个站点名称,输出乘坐地铁最少需要经过的车站数量(含输入的起点和终点,换乘站点只计算一次). 地铁线A(环线)经过车站:A1 A2 A3 A4 A5 A6 A7 A8

华为上机题汇总(二)

华为上机题汇总(二) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总二 目录 第六题 第七题 第八题 第九题 第十题 第六题 6.比较一个数组的元素 是否为回文数组(如abcdcba,hjjh) #include <iostream> #include <vector> #include <string> using namespace std; bool isPalindrome(const string &str){

华为上机题汇总(十三)

华为上机题汇总(十三) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总十三 目录 第六十一题 第六十二题 第六十三题 第六十四题 第六十五题 第六十一题 61.给一个数组,输出数组里超出所有元素平均值的元素的个数.比如:1.2.3.4.5,输出3. #include <iostream> using namespace std; int overAvg(int a[],int n){ int sum = 0, count = 0; for (int i

华为上机题汇总(四)

华为上机题汇总(四) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总四 目录 第十六题 第十七题 第十八题 第十九题 第二十题 第十六题 16.将一个字符串的元音字母复制到另一个字符串,并排序(30分) 问题描述: 有一字符串,里面可能包含英文字母(大写.小写).数字.特殊字符,现在需要实现一函数,将此字符串中的元音字母挑选出来,存入另一个字符串中,并对字符串中的字母进行从小到大的排序(小写的元音字母在前,大写的元音字母在后,依次有序). 说明: 1.

华为上机题汇总(三)

华为上机题汇总(三) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总三 目录 第十一题 第十二题 第十三题 第十四题 第十五题 第十一题 11.选秀节目打分,分为专家评委和大众评委,score[] 数组里面存储每个评委打的分数,judge_type[] 里存储与 score[] 数组对应的评委类别,judge_type[i] == 1,表示专家评委,judge_type[i] == 2,表示大众评委,n表示评委总数.打分规则如下:专家评委和大众评委的分数

华为上机题汇总(二十二)

华为上机题汇总(二十二) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总二十二 目录 第一百零六题 第一百零七题 第一百零八题 第一百零九题 第一百一十题 第一百一十一题 第一百零六题 106.去饭店吃饭 一个男人3元 一个女人2元 一个小孩1元 现输入总人数和总花费 #include <iostream> #include <vector> using namespace std; void display(const vector<

华为上机题汇总(十七)

华为上机题汇总(十七) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总十七 目录 第八十一题 第八十二题 第八十三题 第八十四题 第八十五题 第八十一题 81.对一个二维的整数数组,对指定列进行升序排序,返回排列后的数组 例如: 3 2 2 6 3 3 4 1 1 2 1 3 3 4 6 #include <iostream> using namespace std; void mySort(int **a, int cols, int rows, i

华为上机题汇总(五)

华为上机题汇总(五) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总五 目录 第二十一题 第二十二题 第二十三题 第二十四题 第二十五题 第二十一题 21.通过键盘输入100以内正整数的加.减运算式,请编写一个程序输出运算结果字符串. 输入字符串的格式为:"操作数1 运算符 操作数2","操作数"与"运算符"之间以一个空格隔开. 补充说明: 1. 操作数为正整数,不需要考虑计算结果溢出的情况. 2. 若输