小朋友排队--第五届蓝桥杯

第一种,直接思考的方法,不知对不正确:

/*
 * 标题:小朋友排队
 n 个小朋友站成一排。如今要把他们按身高从低到高的顺序排列,可是每次仅仅能交换位置相邻的两个小朋友。

每一个小朋友都有一个不高兴的程度。

開始的时候。全部小朋友的不高兴程度都是0。
 假设某个小朋友第一次被要求交换,则他的不高兴程度添加1,假设第二次要求他交换。
 则他的不高兴程度添加2(即总的不高兴程度为3)。依次类推。

当要求某个小朋友第k次交换时,他的不高兴程度添加k。
 请问。要让全部小朋友按从低到高排队。他们的不高兴程度之和最小是多少。
 假设有两个小朋友身高一样,则他们谁站在谁前面是没有关系的。
 【数据格式】
 输入的第一行包括一个整数n,表示小朋友的个数。
 第二行包括 n 个整数 H1 H2 … Hn,分别表示每一个小朋友的身高。
 输出一行,包括一个整数,表示小朋友的不高兴程度和的最小值。
 比如,输入:
 3
 3 2 1
 程序应该输出:
 9
 【例子说明】
 首先交换身高为3和2的小朋友,再交换身高为3和1的小朋友,再交换身高为2和1的小朋友,每一个小朋友的不高兴程度都是3。总和为9。
 【数据规模与约定】
 对于10%的数据, 1<=n<=10;
 对于30%的数据, 1<=n<=1000。
 对于50%的数据。 1<=n<=10000;
 对于100%的数据,1<=n<=100000,0<=Hi<=1000000。
 资源约定:
 峰值内存消耗 < 256M
 CPU消耗  < 1000ms
 */
public class 小朋友排队 {
	static int n;
	static int[] s;// 每一个小朋友的身高
	static int bugaoxing = 99999;// 不高兴的值总和

	/**
	 * 当前最高兴的小朋友的值总的高兴值
	 */
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		s = new int[n];
		int[][] count = new int[n][2];

		for (int i = 0; i < n; i++) {
			s[i] = sc.nextInt();
			count[i][0] = 0;
			count[i][1] = 0;
		}
		long start = System.currentTimeMillis();

		int all = exchange(findMin(count), count);

		print("不高兴的总和数量是=" + all);

		long end = System.currentTimeMillis();
		print("此程序执行,花费的时间是" + ((end - start) / 1000.0) + "秒.");

		print("每一个小朋友不高兴的详情信息");
		for (int i = 0; i < n; i++) {
			print(i + "不高兴的值是=" + count[i][0]);
		}

	}

	/**
	 * 交换位置,身高高的向右和身高低的能够换,否则下一个相邻位置
	 *
	 * @param k
	 *            前搜索的位置
	 * @param count
	 *            count[0][]当前每一个交换的小朋友的不高兴程度和count[1][]交换的次数
	 */
	public static int exchange(int k, int[][] count) {
		if (isOk()) {
			int temp = sum(count);
			if (temp < bugaoxing)
				bugaoxing = temp;
			return temp;
		}

		else {
			/** 交换身高,从最不高兴的到最高兴的意思搜索 */
			exchangeAll(count, k);
			System.out.println("K&k+1=" + k + "   " + (k + 1));
			return exchange(findMin(count), count);
		}
	}

	/**
	 *
	 * @return 返回当前相对最高兴的小朋友的下标值,(同事满足身高左高右低的要求)
	 */
	public static int findMin(int[][] count) {
		int[] temp = new int[n];
		for (int i = 0; i < n; i++) {
			temp[i] = count[i][1];
		}

		for (int i = 0; i < n; i++) {
			int min = i;
			for (int j = i + 1; j < n; j++) {
				if (temp[min] > temp[j])
					min = j;
			}
			temp[min] = temp[i];
			if (min < n - 1 && s[min] > s[min + 1])
				return min;
		}
		return n - 2;
	}

	/**
	 * 交换位置和不高兴的值下标k和k+1的交换,同一时候不高兴的值添加
	 *
	 * @return
	 */
	public static void exchangeAll(int[][] count, int k) {
		int temp;
		temp = s[k + 1];
		s[k + 1] = s[k];
		s[k] = temp;

		count[k][1]++;
		count[k][0] = count[k][0] + count[k][1];

		count[k + 1][1]++;
		count[k + 1][0] = count[k + 1][0] + count[k + 1][1];

		int[] temp1 = count[k];
		count[k] = count[k + 1];
		count[k + 1] = temp1;
	}

	public static boolean isOk() {// 是否排好序
		for (int i = 0; i < n; i++) {
			for (int j = i + 1; j < n; j++) {
				if (s[j] < s[i])
					return false;
			}
		}
		return true;
	}

	// 当前全部人不高兴的值的总和
	public static int sum(int[][] count) {
		int temp = 0;
		for (int i = 0; i < n; i++)
			temp += count[i][0];
		return temp;
	}

	public static void print(Object o) {
		System.out.println(o.toString());
	}
}

输入和输出一:

3

3 2 1

K&k+1=0   1

K&k+1=1   2

K&k+1=0   1

不高兴的总和数量是=9

每一个小朋友不高兴的详情信息

0不高兴的值是=3

1不高兴的值是=3

2不高兴的值是=3

此程序执行,花费的时间是0.0秒.

输入和输出二:

5

5 4 3 2 1

K&k+1=0   1

K&k+1=2   3

K&k+1=1   2

K&k+1=3   4

K&k+1=0   1

K&k+1=2   3

K&k+1=1   2

K&k+1=3   4

K&k+1=0   1

K&k+1=2   3

不高兴的总和数量是=50

每一个小朋友不高兴的详情信息

0不高兴的值是=10

1不高兴的值是=10

2不高兴的值是=10

3不高兴的值是=10

4不高兴的值是=10

此程序执行,花费的时间是0.001秒.

输入和输出三:

5

2 5 4 3 1

K&k+1=1   2

K&k+1=3   4

K&k+1=2   3

K&k+1=1   2

K&k+1=0   1

K&k+1=3   4

K&k+1=2   3

不高兴的总和数量是=29

此程序执行,花费的时间是0.0秒.

每一个小朋友不高兴的详情信息

0不高兴的值是=10

1不高兴的值是=1

2不高兴的值是=6

3不高兴的值是=6

4不高兴的值是=6

时间: 2024-10-13 13:00:42

小朋友排队--第五届蓝桥杯的相关文章

第五届蓝桥杯全国软件设计大赛--2013年校内选拔赛Java题目

第五届蓝桥杯全国软件设计大赛 2013年校内选拔赛Java题目 一.考生注意: (1)[结果填空题]要求参赛选手根据题目描述直接填写结果.求解方式不限.不要求源代码. 把答案存入[考生文件夹]下对应题号的文件中即可. (2)[代码填空题]要求参赛选手在弄清给定代码工作原理的基础上填写缺失的部分,使得程序逻辑正确.完整.所填写的代码不超过一条语句(即中间不能出现分号). 把填空的答案(仅填空处的答案,不包括题面已存在的代码)存入[考生文件夹]下对应题号的文件中中即可. (3)[编程题]要求选手设计

第五届蓝桥杯练习题 - 入门练习Java解题代码

>>入门训练 圆的面积 时间限制:1.0s   内存限制:256.0MB 锦囊1 锦囊2 锦囊3 问题描述 给定圆的半径r,求圆的面积. 输入格式 输入包含一个整数r,表示圆的半径. 输出格式 输出一行,包含一个实数,四舍五入保留小数点后7位,表示圆的面积. 说明:在本题中,输入是一个整数,但是输出是一个实数. 对于实数输出的问题,请一定看清楚实数输出的要求,比如本题中要求保留小数点后7位,则你的程序必须严格的输出7位小数,输出过多或者过少的小数位数都是不行的,都会被认为错误. 实数输出的问题

第五届蓝桥杯软件大赛C/C++本科B组决赛解题报告

mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了.这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies .disc_copies都可能会发生. 如何重现这个问题,例子的场景是多个进程同时在不断地mnesia:dirty_write/2 mnesia过载分析 1.抛出警告是在mnesia 增加dump

算法笔记_206:第五届蓝桥杯软件类决赛真题(Java语言A组)

目录 1 海盗分金币 2 六角幻方 3 格子放鸡蛋 4 排列序数 5 幂一矩阵 6 供水设施   1 海盗分金币 有5个海盗,相约进行一次帆船比赛. 比赛中天气发生突变,他们被冲散了. 恰巧,他们都先后经过途中的一个无名的荒岛,并且每个人都信心满满,觉得自己是第一个经过该岛的人. 第一个人在沙滩上发现了一堆金币.他把金币分成5等份.发现刚好少一个金币.他就从自己口袋拿出一个金币补充进去,然后把属于自己的那份拿走. 第二个到达的人也看到了金币,他也和第一个人一样,把所有金币5等分,发现刚好缺少一个

第五届蓝桥杯C++本科A组

今天上午参加了第五届蓝桥杯比赛,还是去年的地方,还是去年的考场,不同的是经过了一年的历练,多了一份坦然与自信.不管最后结果如何,是对自己一年学习的一个小小的交代.ACMER IN HHUC, we never say no. 结果填空 1. a*a+b*b+c*c=1000;a,b,c均为整数,求一组解中的最小值.暴力的题目,很容易就想到了0,10,30.所以没多想就填上了0,可是考完发现还可以是负数...悲了个剧了,三分就这么水没了.. 2. 类似于往年的一道高斯的生日,求距离某一天(yyyy

第五届蓝桥杯 蚂蚁感冒

蚂蚁感冒 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 长100厘米的细长直杆子上有n只蚂蚁.它们的头有的朝左,有的朝右. 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒. 当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行. 这些蚂蚁中,有1只蚂蚁感冒了.并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁. 请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒. 输入 第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数. 接着的一行是n个用空格分

第五届蓝桥杯Java组大学校园选拔真题_n级台阶

/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: 蓝桥杯赛题 * 作    者:   彭俊豪 * 完成日期:   2016   年 04月 01日 * 版 本 号:      001 * 对任务及求解方法的描述部分 * 问题描述: 有n级台阶.从地面(第0级)出发,首先连续的上台阶,上到不超过第n级的某一个位置后再连续的下台阶,直到回到地面.若每次

第五届蓝桥杯C/C++本科B组(真题试做)(9~10)

第九题 迷宫取宝 标题:地宫取宝 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿). 当小明走到出口时,如果他手中的宝贝恰好是k件,则这些宝贝就可以送给小明. 请你帮小明算一算,在给定的局面下,他有多少种不同的行动方案能获得这k件宝贝. [数据格式] 输入

2014年第五届蓝桥杯试题C/C++程序设计B组——奇怪的分式

题目描述: 标题:奇怪的分式 上小学的时候,小明经常自己发明新算法.一次,老师出的题目是: 1/4 乘以 8/5 小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png) 老师刚想批评他,转念一想,这个答案凑巧也对啊,真是见鬼! 对于分子.分母都是 1~9 中的一位数的情况,还有哪些算式可以这样计算呢? 请写出所有不同算式的个数(包括题中举例的). 显然,交换分子分母后,例如:4/1 乘以 5/8 是满足要求的,这算做不同的算式. 但对于分子分母相同的情况,2/2 乘以