蓝桥杯31天冲刺之五 [java]

猴子分香蕉

image-20220312112649280

题目链接: https://www.lanqiao.cn/problems/618/learning/

这个题直接使用模拟的方法就好了,读题可能会比较费劲

每个猴子有三个操作,首先把自己看到的香蕉(设为n)平均分为五堆,如果有剩余的就吃掉(设为x),然后再把自己的藏起来

所以下一只猴子看到的香蕉总数就是 4 5 ( n − x ) \frac{4}{5}(n-x) 54(nx),然后根据这个公式一直递推就好了

我开始算出来的是16,没有通过测试,自己手动算了算,发现如果是这样的话倒数第二个猴子藏了0个,并且最后一个猴子根本看不到香蕉,所以,就在判断函数里面加了每只猴子看到至少有1个香蕉的判断条件

package daily;

/**
 * https://www.lanqiao.cn/problems/618/learning/
 * 
 * @author Jia
 *
 */
public class day3_12_1 {
	public static void main(String[] args) {
		int n = 11;// 从11开始是因为加起来吃了10根,所以至少有10根
		while (true) {
			if (judge(n)) {
				System.out.println(n);
				break;
			}
			n++;
		}
	}

	/**
	 * 这个函数用于判断当前数量的香蕉是否满足条件 这里面加入n <= 0的判断是因为所有的猴子都看到了有香蕉,所以需要加这个条件判断
	 * 
	 * @param n
	 * @return
	 */
	private static boolean judge(int n) {
		if (n % 5 != 1) {
			return false;
		}
		n = (n - 1) / 5 * 4;// 第一只猴子吃了一个,然后藏了自己的一份,所以剩下数量是总数减一的五分之四
		if (n <= 0 || n % 5 != 2) {
			return false;
		}
		n = (n - 2) / 5 * 4;// 第二个猴子吃了两个,然后藏了自己的一份,所以剩的数量是总数减二的五分之四
		if (n <= 0 || n % 5 != 3) {
			return false;
		}
		n = (n - 3) / 5 * 4;// 第三个猴子吃了三个,然后藏了自己的一份,所以剩的数量是总数减三的五分之四
		if (n <= 0 || n % 5 != 4) {
			return false;
		}
		n = (n - 4) / 5 * 4;// 第三个猴子吃了四个,然后藏了自己的一份,所以剩的数量是总数减四的五分之四
		if (n <= 0 || n % 5 != 0) {
			return false;
		}

		return true;
	}
}

等差数列

image-20220312112716238

题目链接: https://www.lanqiao.cn/problems/192/learning/

将输入的数字排序,然后统计相邻数字的差值,取其中最小的作为公差,然后使用(最大值-最小值)/ 公差 + 1就可以得到最终的结果

但是存在这样一种情况,例如序列为 2 4 7 9 ,这样算下来相邻的差值为 2 3 2,按照我的这种方法选择的公差直接就是2了,但是实际最大的公差应该是所有差值的最大公因数,也就是1。这个题的测试样例有一点点的小问题,下面的代码虽然ac了,但是是不严谨的方法,可以直接跳了看其他人的

package daily;

import java.util.Arrays;
import java.util.Scanner;

/**
 * https://www.lanqiao.cn/problems/192/learning/
 * 
 * @author Jia
 *
 */
public class day3_12_2 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int[] nums = new int[N];
		for (int i = 0; i < N; i++) {
			nums[i] = sc.nextInt();
		}
		sc.close();
		Arrays.sort(nums);// 对数组进行由小到大排序

		int minStep = Integer.MAX_VALUE;// 这个值记录最小公差

		// 统计最小公差
		for (int i = 0; i < nums.length - 1; i++) {
			minStep = Math.min(minStep, nums[i + 1] - nums[i]);
		}

		// 需要分开判断一下最小公差是不是0,如果不判断会出现除0异常,然后在系统提交时会出现`无效的返回`
		if (minStep == 0) {
			System.out.println(nums.length);
			return;
		} else {
			int length = 1 + (nums[nums.length - 1] - nums[0]) / minStep;
			System.out.println(length);
		}
	}
}

平方序列

image-20220312112747965

题目链接: https://www.lanqiao.cn/problems/808/learning/

这个题如果暴力求解的话或许也行,应该不会超时,但是不好确定X和Y的范围

我解的时候是去遍历X的值,然后根据等差公式的性质得到Y平方的值(根据 b - a = c - b得到c = 2b - a)

然后再是去判断这个Y是不是一个正整数,我这里用的是一个比较简单的方法,把double转换会正数后会丢掉小数部分,如果与原double类型判断仍然相等,说明小数部分为0

package daily;

/**
 * https://www.lanqiao.cn/problems/808/learning/
 * 
 * @author Jia
 *
 */
public class day3_12_3 {
	public static void main(String[] args) {
		int N_square = 2019 * 2019;
		int X = 2020;
		while (true) {
			int X_square = X * X;
			// 根据 b - a = c - b得到c = 2b - a
			int Y_square = 2 * X_square - N_square;
			double Y_sqrt = Math.sqrt(Y_square);
			int Y = (int) Y_sqrt;
			// 如果去掉小数后与原数字相等,说明这个数小数部分为0
			if (Y_sqrt == Y) {
				System.out.println(X + Y);
				break;
			}
			X++;
		}
	}
}

倍数问题

image-20220312113351229

题目链接:https://www.lanqiao.cn/problems/168/learning/

还没写,今天太忙了,先咕咕咕了,机组实验杀我


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hydrion-Qlz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值