最小步数
2025华为OD机试 - 华为OD上机考试 100分题型
华为OD机试真题目录点击查看: 华为OD机试真题题库目录|机考题库 + 算法考点详解
题目描述
求从坐标零点到坐标点n的最小步数,一次只能沿横坐标轴向左或向右移动 2 或 3。
注意:途径的坐标点可以为负数
输入描述
坐标点n,1 <= n <= 10^9
输出描述
输出从坐标零点移动到坐标点n的最小步数
用例1
输入
4输出
2说明
从坐标零点移动到4,最小需要两步,即右移2,再右移2
题解
思路:数学规律
- 本题只会存在两种情况, 对于
n == 1时的情况为{-2,3},需要两步。 - 对于
n >=2的情况,存在规律需要的步数为ceil(n /3)向上取整 - 明白上面规律之后,这个题就很简单了。
c++
#include<iostream> #include<vector> #include<string> #include <utility> #include <sstream> #include<algorithm> #include<cmath> #include<map> #include<cmath> using namespace std; int main() { int n ; cin >> n; // -2 3 if (n == 1) { cout << 2; } else { //cout << (int)ceil(1.0 * n / 3); cout << (n + 2) / 3; } return 0; }JAVA
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); // -2 3 if (n == 1) { System.out.print(2); } else { // cout << (int)ceil(1.0 * n / 3); System.out.print((n + 2) / 3); } } }Python
n=int(input())# -2 3ifn==1:print(2)else:# print(math.ceil(1.0 * n / 3))print((n+2)//3)JavaScript
constreadline=require('readline');constrl=readline.createInterface({input:process.stdin,output:process.stdout,terminal:false});rl.on('line',line=>{letn=parseInt(line.trim());// -2 3if(n===1){console.log(2);}else{console.log(Math.floor((n+2)/3));}});Go
packagemainimport"fmt"funcmain(){varnintfmt.Scan(&n)// -2 3ifn==1{fmt.Print(2)}else{// fmt.Print(int(math.Ceil(float64(n) / 3)))fmt.Print((n+2)/3)}}