java30天蓝桥杯打卡(day05)

1.猴子分香蕉

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

5 只猴子是好朋友,在海边的椰子树上睡着了。这期间,有商船把一大堆香蕉忘记在沙滩上离去。

第 1 只猴子醒来,把香蕉均分成 5 堆,还剩下 1 个,就吃掉并把自己的一份藏起来继续睡觉。

第 2只猴子醒来,把香蕉均分成 5堆,还剩下 2 个,就吃掉并把自己的一份藏起来继续睡觉。

第 3 只猴子醒来,把香蕉均分成 5 堆,还剩下 3 个,就吃掉并把自己的一份藏起来继续睡觉。

第 4 只猴子醒来,把香蕉均分成 5 堆,还剩下 4 个,就吃掉并把自己的一份藏起来继续睡觉。

第 5 猴子醒来,重新把香蕉均分成 5 堆,哈哈,正好不剩!

请计算一开始最少有多少个香蕉

解题思路:总共只有5只猴子,且每只猴子醒来后都会将香蕉分成5份并取走5份外剩下的香蕉,所以我们可以在for循环里采用列举的情况列出满足题意的条件,这是我的第二种做法,至于第一种做法,做出来得不到答案,我也不知道哪里出错了,如果有哪位朋友看到了,希望能帮我看下,并指出,先在这里谢了,不过这道题也教会了我一个道理,如果碰到这种数字条件不大的,可以采用暴力,一一列举,这样做题的速度会提高

第一种解法:错误的,找不出原因

package 蓝桥杯day05;

public class 猴子分香蕉 {
	public static void main(String[] args) {
		for(int i=1;i>0;i++) {
			int num1=i;
			if(Startnum(num1)) {
				System.out.println(i);
				break;
			}
		}
	}
	
	public static boolean Startnum(int num) {
		int count=0;
		int temp1=0;
		while(num>0) {
			int temp=num%5;
			if(temp>0&&temp==temp1+1) {
				 num=num-num/5-temp;
				 count++;
				 temp1=temp;
			}else if(num>0&&temp==0) {
				 count++;
				 if(count==5)
					 return true;
				 else return false;
			 }
		}
		return false;
}
}

 第二种解法:

package 蓝桥杯day05;

public class 猴子分香蕉 {
	public static void main(String[] args) {
        int num=i;
		for(int i=1;i>0;i++) {
			int num=i;
			if(num%5==1) {
				num=num-num/5-num%5;
				if(num%5==2) {
					num=num-num/5-num%5;
					if(num%5==3) {
						num=num-num/5-num%5;
						if(num%5==4) {
							num=num-num/5-num%5;
							if(num%5==0) {
								if(num!=0) {
									System.out.println(i);
									break;
								}
							}
						}
					}
				}
			}
		}
	}
}

2.等差数列

题目描述

数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一 部分的数列,只记得其中 NN 个整数。

现在给出这 NN 个整数,小明想知道包含这 NN 个整数的最短的等差数列有几项?

输入描述

输入的第一行包含一个整数 NN。

第二行包含 NN 个整数 A_1,A_2,··· ,A_NA1​,A2​,⋅⋅⋅,AN​。(注意 A_1A1​ ∼ A_NAN​ 并不一定是按等差数列中的顺序给出)

其中,2 \leq N \leq 10^5,0 \leq A_i \leq 10^92≤N≤105,0≤Ai​≤109。

输出描述

输出一个整数表示答案。

输入输出样例

示例

输入

5
2 6 4 10 20

输出

10

样例说明: 包含 2、6、4、10、20 的最短的等差数列是 2、4、6、8、10、12、14、16、 18、20。

解题思路:

如何确定公差:如果 A 中的元素一定是等差数列的中一部分,则 gcd(g, A[i]-A[0]) = d,d 就是公差
如何算项数:由 a n = a 1 + ( n − 1 ) × d 可以得n=(an-a1)/d+1

细节:当 d=0 时,也就是 A 中所有数相等,此时 n 如果用上述公式算会得到 数列中所有整数的个数

package 蓝桥杯day05;

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

public class 等差数列 {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int N=sc.nextInt();
		int[] arr=new int[N];
		for(int i=0;i<N;i++) {
			arr[i]=sc.nextInt();
		}
		Arrays.sort(arr);
		int d=0;
		for(int i=0;i<N-1;i++) {
			d=GCD(d,arr[i+1]-arr[i]);
		}
		if(d==0) {
			System.out.println(N);
		}else {
			int res=(arr[N-1]-arr[0])/d+1;
			System.out.println(res);
		}
		sc.close();
	}
	
	public static int GCD(int a,int b) {
		if(b==0)return a;
		else return GCD(b,a%b);
	}
}

3.平方序列 

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小明想找到两个正整数 X 和 Y,满足

  1. 2019 < X < Y;
  2. 2019^2, X^2, Y^2组成等差数列。

请你求出在所有可能的解中,X+Y 的最小值是多少?

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M
package 蓝桥杯day05;

public class 平方序列 {
	static long x;
	static long y;
	public static void main(String[] args) {
//		要满足得到最小的x,y,则应使d尽可能小
		for(int d=1;;d++) {
			if(Getmin(d)) {
				System.out.println(x+y);
				return ;
			}
		}
		}
	
	public static boolean Getmin(int d) {
		long xx=2019*2019+d;
		long yy=2019*2019+2*d;
		x=(long)Math.sqrt(xx);
		y=(long)Math.sqrt(yy);
		if(x*x!=xx||y*y!=yy) {//开方后不是整数,则不符合条件,因为要找的是两个整数
			return false;
		}else return true;
	
	}
	
}

 4.倍数问题

题目描述

众所周知,小葱同学擅长计算,尤其擅长计算一个数是否是另外一个数的倍数。但小葱只擅长两个数的情况,当有很多个数之后就会比较苦恼。现在小葱给了你 nn 个数,希望你从这 nn 个数中找到三个数,使得这三个数的和是 KK 的倍数,且这个和最大。数据保证一定有解。

输入描述

第一行包括 2 个正整数 n, K。

第二行 n 个正整数,代表给定的 n 个数。

输出描述

输出一行一个整数代表所求的和。

输入输出样例

示例

输入

4 3
1 2 3 4

输出

9

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

 这道题主要是跟大家分享一下自己的做法,因为在eclipse上自己测试的案例都是对的,但提交到蓝桥云系统不能通过,所以我自己也不能确定是不是对的。

1.我们有n个数,然后要在n个数里找除3个数,且这3个数的和是K的倍数,因此,我们其实可以把他看成是一个全排列问题。首先,我们可以在n个数里任意排列3个数,即使用全排序得到所有可能的3个数的组合。

2.之后,我们可以对得到的组合进行约束,即3数之和需是k的倍数,然后把符合条件的3数之和放进一维数组list,之后再对数组进行排序,取出最大的值即为答案。

3.代码基本完全是套用深度搜索的模板,然后再加一些约束条件,我也是有点生搬硬套的使用,如果有小伙伴能发现一些错误,希望能指出来哦,大家一起进步!

package 蓝桥杯day05;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class 倍数问题 {
	//path数组用来存储得到的arr数组元素
	static List<Integer> path=new ArrayList<>();
	//list数组用来存储满足是k的倍数的3数之和
	static List<Integer> list=new ArrayList<>();
	static int sum=0;
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int K=sc.nextInt();
		int[] arr=new int[n];
		//输入n个数
		for(int i=0;i<n;i++) {
			arr[i]=sc.nextInt();
		}
		dfs(arr,n,K,0);
		Collections.sort(list);
		System.out.println(list.get(list.size()-1));
		
	}
	
	//深度搜素
	public static void dfs(int[] arr,int n,int K,int start){
		//当path.size()长度为3时,结束遍历
		if(path.size()==3) {
			//如果此时sum满足是k的倍数的话,将sum放入list内
			if(sum%K==0) {
				list.add(sum);
			}
			return;
		}
		for(int i=start;i<n;i++) {
			//将arr数组元素放入path
			path.add(arr[i]);
			//将得到的arr数组元素相加
			sum+=arr[i];
			dfs(arr,n,K,i+1);
			sum-=arr[i];//回溯
			path.remove(path.size()-1);//回溯
		}
	}
}

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值