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,满足
- 2019 < X < Y;
- 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);//回溯 } } }