水桶问题
题目:有一个圆柱形水桶,高度为 h,底面半径为 r。需要多少桶这样的水才能装满一个 20 升(20000 毫升)的容器?
输入格式
两个整数 h 和 r,分别表示水桶的高度和底面半径(单位:厘米)。
输出格式
一个整数,表示需要的水桶数量(向上取整)。
样例输入
10 5
样例输出
26
解题思路
本题的核心是计算圆柱形容器的体积,并根据目标容量计算所需数量。
关键步骤分析:
圆柱体积公式:V = π × r² × h
- 其中 π 取 3.14(题目要求)
- r 为底面半径,h 为高度
- 体积单位为立方厘米(毫升)
容量换算:20升 = 20000毫升
- 注意单位统一,避免计算错误
数量计算:所需桶数 = 20000 ÷ 单桶体积
- 计算结果可能为小数
- 需要向上取整(因为不足一桶也需要一桶)
向上取整原理:
- 数学上:ceil(x) 表示不小于 x 的最小整数
- 实际意义:即使只需要10.1桶,实际也需要11桶
数学表达式:
单桶体积 V = 3.14 × r² × h 所需桶数 N = ceil(20000 / V)Java代码实现
packageLuogu;importjava.util.Scanner;/** * @author jinhong * @date 2026/7/24 16:59 * @description 水桶问题 */publicclassMain07241{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);inth=sc.nextInt();intr=sc.nextInt();// 计算水桶体积(毫升)doubleb=3.14*r*r*h;// 计算需要的水桶数量doublet=20000/b;// 向上取整intans=(int)Math.ceil(t);System.out.println(ans);}}代码解析
算法流程
- 数据输入:读取高度 h 和半径 r
- 体积计算:应用圆柱体积公式 V = 3.14 × r² × h
- 数量计算:N = 20000 / V
- 结果处理:对 N 向上取整并输出
关键点说明
1.π的取值:题目明确要求使用 3.14,而非 Math.PI
2.单位处理:所有计算在毫升单位下进行,无需额外转换
3.数据类型:体积使用 double 类型,确保计算精度
4.取整方法:Math.ceil() 实现向上取整功能
注意事项
边界情况
- 大体积水桶:当单桶体积 ≥ 20000 毫升时,结果始终为 1
- 极小体积:理论上需要大量水桶,但题目会限制合理输入范围
- 整数输入:题目保证 h 和 r 为正整数,无需处理负数或零
常见错误
- 忘记单位换算(20升 = 20000毫升)
- 使用整数除法导致精度丢失
- 错误使用四舍五入而非向上取整
总结
核心知识点
- 几何计算:掌握圆柱体积公式 V = πr²h
- 单位换算:理解升与毫升的换算关系(1升 = 1000毫升)
- 数值处理:学习向上取整的实际应用场景
- 精度控制:了解浮点数计算与整数除法的区别
寻找数组最小值问题
题目:给定一个整数数组,找出数组中的最小值。
输入格式
第一行一个整数 n,表示数组的长度。
第二行 n 个整数,表示数组的元素。
输出格式
一个整数,表示数组中的最小值。
样例输入
5
3 1 4 1 5
样例输出
1
解题思路
本题的核心是遍历数组,找到最小的元素。
关键步骤分析:
- 输入处理:首先读取数组长度 n,然后读取 n 个整数存入数组
- 初始化最小值:将最小值初始化为一个较大的数(如题目中最大可能值+1)
- 遍历比较:遍历数组中的每个元素,与当前最小值比较
- 更新最小值:如果当前元素小于最小值,则更新最小值
- 输出结果:遍历完成后输出最小值
Java代码实现
packageLuogu;importjava.util.Scanner;/** * @author jinhong * @date 2026/7/24 20:08 * @description 寻找数组最小值 */publicclassMain07242{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);intn=sc.nextInt();int[]arr=newint[n];// 读取数组元素for(inti=0;i<n;i++){arr[i]=sc.nextInt();}// 初始化最小值为一个较大的数intmin=1000;// 假设题目中元素不超过1000// 遍历数组寻找最小值for(inti=0;i<arr.length;i++){if(min>arr[i]){min=arr[i];}}System.out.println(min);}}代码解析
算法流程
- 数据输入:读取数组长度 n 和 n 个整数
- 数组存储:将 n 个整数存储到数组中
- 初始化最小值:将 min 初始化为 1000(假设题目中元素值不超过1000)
- 遍历比较:遍历数组,比较每个元素与当前最小值
- 更新最小值:如果找到更小的元素,更新 min 的值
- 输出结果:输出最终的最小值
注意事项
边界情况
- 空数组:如果 n=0,代码会创建空数组但后续逻辑可能出错
- 负数情况:如果数组包含负数,初始化 min=1000 可能不正确
- 大数值:如果数组元素可能大于1000,初始化 min=1000 会导致错误结果
常见错误
- 忘记读取数组长度 n
- 数组索引越界(如循环条件写错)
- 最小值初始化不当
- 使用
min < arr[i]而不是min > arr[i]进行比较
总结
核心知识点
- 数组操作:掌握数组的声明、初始化和遍历
- 最小值查找:理解遍历比较的基本算法
- 边界处理:学会正确处理各种边界情况
- 输入输出:熟练使用 Scanner 进行标准输入输出
统计前面小于当前元素的个数问题
题目:给定一个整数数组,对于每个元素,统计它前面有多少个元素比它小,并依次输出这些统计结果。
输入格式
第一行一个整数 n,表示数组的长度。
第二行 n 个整数,表示数组的元素。
输出格式
一行 n 个整数,第 i 个整数表示第 i 个元素前面比它小的元素个数,每个整数后跟一个空格。
样例输入
5
3 1 4 1 5
样例输出
0 0 2 0 4
解题思路
本题的核心是对于每个元素,遍历它前面的所有元素,统计比它小的元素个数。
关键步骤分析:
- 输入处理:读取数组长度 n,然后读取 n 个整数存入数组
- 双重循环遍历:对于每个位置 i,遍历它前面的所有位置 j (0 ≤ j < i)
- 比较统计:如果 arr[j] < arr[i],则计数器加1
- 输出结果:对每个元素 i 输出统计结果,注意格式要求(每个结果后跟空格)
Java代码实现
packageLuogu;importjava.util.Scanner;/** * @author jinhong * @date 2026/7/24 20:29 * @description 统计前面小于当前元素的个数 */publicclassMain07243{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);intn=sc.nextInt();int[]arr=newint[n];// 读取数组元素for(inti=0;i<n;i++){arr[i]=sc.nextInt();}// 对于每个元素,统计前面比它小的元素个数for(inti=0;i<n;i++){intcount=0;for(intj=0;j<i;j++){if(arr[j]<arr[i]){count++;}}System.out.print(count+" ");}}}代码解析
算法流程
- 数据输入:读取数组长度 n 和 n 个整数
- 数组存储:将 n 个整数存储到数组中
- 外层循环:遍历数组中的每个元素 i
- 内层循环:对于每个元素 i,遍历它前面的所有元素 j (0 ≤ j < i)
- 比较统计:如果 arr[j] < arr[i],则计数器 count 加1
- 输出结果:输出当前元素的统计结果,后跟一个空格
关键点说明
- 双重循环结构:外层循环控制当前元素位置 i,内层循环遍历 i 前面的所有元素
- 比较条件:使用
if (arr[j] < arr[i])判断前面元素是否小于当前元素 - 计数器重置:对于每个新元素 i,计数器 count 需要重新初始化为 0
- 输出格式:使用
System.out.print(count + " ")确保每个结果后都有空格
注意事项
边界情况
- 空数组:如果 n=0,代码不会进入循环,没有输出(可能需要特殊处理)
- 单个元素:当 n=1 时,内层循环不会执行,输出为 "0 "
- 重复元素:如果前面有与当前元素相等的元素,不会被计入 count
- 大数组:当 n 较大时,O(n²) 的算法可能会超时
常见错误
- 忘记读取数组长度 n
- 内层循环条件写错(如 j <= i 会导致与自身比较)
- 计数器没有在每个外层循环迭代中重置为 0
- 输出格式不符合要求(如缺少空格或换行)
总结
核心知识点
- 双重循环:掌握嵌套循环的使用场景和技巧
- 数组遍历:熟练使用数组索引进行前后元素的访问
- 条件统计:学习如何根据条件进行计数操作
- 输出格式控制:注意题目对输出格式的细节要求