猴子分香蕉
题目链接: https://www.lanqiao.cn/problems/618/learning/
这个题直接使用模拟的方法就好了,读题可能会比较费劲
每个猴子有三个操作,首先把自己看到的香蕉(设为n)平均分为五堆,如果有剩余的就吃掉(设为x),然后再把自己的藏起来
所以下一只猴子看到的香蕉总数就是 4 5 ( n − x ) \frac{4}{5}(n-x) 54(n−x),然后根据这个公式一直递推就好了
我开始算出来的是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;
}
}
等差数列
题目链接: 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);
}
}
}
平方序列
题目链接: 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++;
}
}
}
倍数问题
题目链接:https://www.lanqiao.cn/problems/168/learning/
还没写,今天太忙了,先咕咕咕了,机组实验杀我