【每日蓝桥】24、一四年省赛Java组真题“分糖果”

你好呀,我是灰小猿,一个超会写bug的程序猿!

欢迎大家关注我的专栏“每日蓝桥”,该专栏的主要作用是和大家分享近几年蓝桥杯省赛及决赛等真题,解析其中存在的算法思想、数据结构等内容,帮助大家学习到更多的知识和技术!

标题:分糖果

有n个小朋友围坐成一圈,老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:

每个小朋友都把自己的糖果的一半给左手边的孩子,

一轮分糖后,拥有奇数颗糖果的孩子由老师补给1个糖果,从而变成偶数,

反复进行这个游戏,直到所有的小朋友的糖果数都相同为止。

你的任务就是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。

【格式要求】

程序首先读入一个整数N(2<N<100),表示小朋友的人数,

借着是一行用空格分开的N个偶数(每个偶数不大于1000,不小于2)

要求程序输出一个整数,表示老师需要补发的糖果数。

例如:输入

3

2 2 4

程序应该输出:

4

资源约定:

峰值内存消耗(含虚拟机)< 256M

CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足的打印类似“请您输入...”的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意:不要使用package语句,不要使用jdk1.6及以上的版本特性

注意:主类的名称必须是Main 否则按无效代码处理。

解题思路:

在这一道题中的思路还是比较明确的,我们可以将每一个小朋友拥有的糖果数量存放在数组中,然后可以使用while循环或者递归来进行每一轮的游戏,在每一轮游戏结束后,判断数组中的元素个数是否相等。

接下来采用while循环和递归来分别求解这道题:

答案源码:

while循环法

package 一四年省赛真题;

import java.util.Scanner;

public class Year2014_Bt8_2 {

	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 < arr.length; i++) {
			arr[i] = scanner.nextInt();
		}
		int ans = 0;
		while (true) {
			int firstN = arr[0];
			for (int i = 0; i < arr.length; i++) {
				if (i==arr.length-1) {
					arr[i] = arr[i]/2 + firstN/2;
				} else {
					arr[i] = arr[i]/2 + arr[i+1]/2;	
				}
			}
			//老师补发糖果
			for (int i = 0; i < arr.length; i++) {
				//如果当前手中的糖果数量是奇数个
				if (arr[i]%2!=0) {
					arr[i]+=1;
					ans++;
				}
			}
			//判断数组中的元素是否都相等
			if (check(arr)) {
				System.out.println(ans);
			}
			
		}

	}

	//判断数组元素值是否都相等
	private static boolean check(int[] arr) {
		for (int i = 0; i < arr.length; i++) {
			if (arr[i]!=arr[0]) {
				return false;
			}
		}
		return true;
	}
	}

}

递归法

package 一四年省赛真题;

import java.util.Scanner;

public class Year2014_Bt8 {
	static int ans = 0;	//记录补发的糖果数
	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 < arr.length; i++) {
			arr[i] = scanner.nextInt();
		}
		f(arr);
		System.out.println(ans);

	}

	//每一轮游戏
	private static void f(int[] arr) {
		
		int firstN = arr[0];	//记录第一个数组元素
		//利用循环将每一个小朋友手中的糖果给左边的小朋友分一半
		for (int i = 0; i < arr.length; i++) {
			if (i==arr.length-1) {
				arr[i] = arr[i]/2 + firstN/2;
			}else {
				arr[i] = arr[i]/2 + arr[i+1]/2;
			}		
		}
		//老师补发糖果
		for (int i = 0; i < arr.length; i++) {
			//如果当前手中的糖果数量是奇数个
			if (arr[i]%2!=0) {
				arr[i]+=1;
				ans+=1;
			}
		}
		//判断数组中的元素是否都相等
		if (check(arr)) {
			return;
		}
		//进行下一轮游戏
		f(arr);
		
	}

	//判断数组元素值是否都相等
	private static boolean check(int[] arr) {
		for (int i = 0; i < arr.length; i++) {
			if (arr[i]!=arr[0]) {
				return false;
			}
		}
		return true;
	}

}

输出样例:

其中有不足或者改进的地方,还希望小伙伴留言提出,一起学习!

感兴趣的小伙伴可以关注专栏!

灰小猿陪你一起进步!

猜你喜欢

转载自blog.csdn.net/weixin_44985880/article/details/113727649