#C42. 华为OD机试统一考试D卷C卷 - 小明的幸运数

华为OD机试统一考试D卷C卷 - 小明的幸运数

题目链接

华为OD机试统一考试D卷C卷 - 小明的幸运数(C++ Java JavaScript Python C语言)

https://blog.csdn.net/banxia_frontend/article/details/134772493

题目描述

小明在玩一个游戏,游戏规则如下:在游戏开始前,小明站在坐标轴原点处(坐标值为0).

给定一组指令和一个幸运数,每个指令都是一个整数,小明按照指令前进指定步数或者后退指定步数。前进代表朝坐标轴的正方向走,后退代表朝坐标轴的负方向走。

幸运数为一个整数,如果某个指令正好和幸运数相等,则小明行进步数+1。

例如:

幸运数为3,指令为[2,3,0,-5]

指令为2,表示前进2步;

指令为3,正好和幸运数相等,前进3+1=4步;

指令为0,表示原地不动,既不前进,也不后退。

指令为-5,表示后退5步。

请你计算小明在整个游戏过程中,小明所处的最大坐标值。

输入描述

第一行输入1个数字,代表指令的总个数 n(1 ≤ n ≤ 100)

第二行输入1个数字,代表幸运数m(-100 ≤ m ≤ 100)

第三行输入n个指令,每个指令的取值范围为:-100 ≤ 指令值 ≤ 100

输出描述

输出在整个游戏过程中,小明所处的最大坐标值。异常情况下输出:12345

用例1

输入

2
1
-5 1

输出

0

说明

总共2个指令,幸运数为1,按照指令行进,依次如下游戏开始前,站在坐标轴原点,此时坐标值为0;

指令为-5,后退5步,此时坐标值为-5;

指令为1,正好等于幸运数,前进1+1=2步,此时坐标值为-3;

整个游戏过程中,小明所处的坐标值依次为[0, -5, -3],最大坐标值为0。

用例2

输入

5
-5
-5 1 6 0 -7

输出

1

说明

总共5个指令,幸运数为-5,依照指令行进,依次如下:

游戏开始前,站在坐标轴原点,此时坐标值为0,

指令为-5,正好等于幸运数,后退5+1=6步,此时坐标值为-6;

指令为1,前进1步,此时坐标值为-5;

指令为6,前进6步,此时坐标值为1;

指令为0,既不前进,也不后退,此时坐标值为1;

指令为-7,后退7步,此时坐标值为-6。

整个游戏过程中,小明所处的坐标值依次为:

[0, -6, -5, 1, 1, -6],最大坐标值为1。

解题思路

本题就模拟计算,主要注意幸运数字是0的情况.

C++

#include <iostream>
#include <vector>
#include <sstream>
#include <algorithm>

using namespace std;

int main() {
    // 创建一个新的扫描器实例
    string line;
    
    // 读取用户输入的整数n和l
    getline(cin, line);
    int n = stoi(line);
    getline(cin, line);
    int lucky = stoi(line);

    // 检查输入的整数n和l是否在指定的范围内
    if (n < 1 || n > 100 || lucky < -100 || lucky > 100) {
        cout << "12345" << endl;
        return 0;
    }

    // 初始化位置变量p和最大位置变量mp
    int p = 0;
    int mp = 0;

    // 读取用户输入的整数cmd
    getline(cin, line);
    stringstream ss(line);
    vector<int> cmds;
    for (int i = 0; i < n; i++) {
        int cmd;
        ss >> cmd;
        cmds.push_back(cmd);
    }

    // 对于每一个输入的整数
    for (int i = 0; i < n; i++) {
        int cmd = cmds[i];

        // 检查输入的整数cmd是否在指定的范围内
        if (cmd < -100 || cmd > 100) {
            cout << "12345" << endl;
            return 0;
        }
        // 如果输入的整数cmd等于l
        if (cmd == lucky) {
            // 如果cmd大于0,那么位置p增加cmd+1
            if (cmd > 0) {
                p += cmd + 1;
            } else if(cmd < 0){
                // 否则,位置p减少cmd-1
                p += cmd - 1;
            }
        } else {
            // 如果输入的整数cmd不等于l,那么位置p增加cmd
            p += cmd;
        }
        // 更新最大位置变量mp
        mp = max(mp, p);
    }

    // 打印最大位置变量mp
    cout << mp << endl;

    return 0;
}

Java

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 创建一个新的扫描器实例
        Scanner sc = new Scanner(System.in);

        // 读取用户输入的整数n和l
        int n = Integer.parseInt(sc.nextLine());
        int lucky = Integer.parseInt(sc.nextLine());

        // 检查输入的整数n和l是否在指定的范围内
        if (n < 1 || n > 100 || lucky < -100 || lucky > 100) {
            System.out.println("12345");
            return;
        }

        // 初始化位置变量p和最大位置变量mp
        int p = 0;
        int mp = 0;

        // 读取用户输入的整数cmd
        String[] cmds = sc.nextLine().split(" ");

        // 对于每一个输入的整数
        for (int i = 0; i < n; i++) {
            int cmd = Integer.parseInt(cmds[i]);

            // 检查输入的整数cmd是否在指定的范围内
            if (cmd < -100 || cmd > 100) {
                System.out.println("12345");
                return;
            }
            // 如果输入的整数cmd等于l
            if (cmd == lucky) {
                // 如果cmd大于0,那么位置p增加cmd+1
                if (cmd > 0) {
                    p += cmd + 1;
                } else if(cmd < 0){
                    // 否则,位置p减少cmd-1
                    p += cmd - 1;
                }
            } else {
                // 如果输入的整数cmd不等于l,那么位置p增加cmd
                p += cmd;
            }
            // 更新最大位置变量mp
            mp = Math.max(mp, p);
        }

        // 打印最大位置变量mp
        System.out.println(mp);
    }
}

javaScript

const readline = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout
});

// 创建一个新的扫描器实例
let input = [];

readline.on('line', (line) => {
    input.push(line);
});

readline.on('close', () => {
    // 读取用户输入的整数n和l
    let n = parseInt(input[0]);
    let lucky = parseInt(input[1]);

    // 检查输入的整数n和l是否在指定的范围内
    if (n < 1 || n > 100 || lucky < -100 || lucky > 100) {
        console.log("12345");
        process.exit(0);
    }

    // 初始化位置变量p和最大位置变量mp
    let p = 0;
    let mp = 0;

    // 读取用户输入的整数cmd
    let cmds = input[2].split(" ").map(Number);

    // 对于每一个输入的整数
    for (let i = 0; i < n; i++) {
        let cmd = cmds[i];

        // 检查输入的整数cmd是否在指定的范围内
        if (cmd < -100 || cmd > 100) {
            console.log("12345");
            process.exit(0);
        }
        // 如果输入的整数cmd等于l
        if (cmd == lucky) {
            // 如果cmd大于0,那么位置p增加cmd+1
            if (cmd > 0) {
                p += cmd + 1;
            } else if(cmd < 0){
                // 否则,位置p减少cmd-1
                p += cmd - 1;
            }
        } else {
            // 如果输入的整数cmd不等于l,那么位置p增加cmd
            p += cmd;
        }
        // 更新最大位置变量mp
        mp = Math.max(mp, p);
    }

    // 打印最大位置变量mp
    console.log(mp);
});

Python

# 创建一个新的扫描器实例
import sys

# 读取用户输入的整数n和l
n = int(sys.stdin.readline())
lucky = int(sys.stdin.readline())

# 检查输入的整数n和l是否在指定的范围内
if n < 1 or n > 100 or lucky < -100 or lucky > 100:
    print("12345")
    sys.exit()

# 初始化位置变量p和最大位置变量mp
p = 0
mp = 0

# 读取用户输入的整数cmd
cmds = list(map(int, sys.stdin.readline().split()))

# 对于每一个输入的整数
for i in range(n):
    cmd = cmds[i]

    # 检查输入的整数cmd是否在指定的范围内
    if cmd < -100 or cmd > 100:
        print("12345")
        sys.exit()
    # 如果输入的整数cmd等于l
    if cmd == lucky:
        # 如果cmd大于0,那么位置p增加cmd+1
        if cmd > 0:
            p += cmd + 1
        elif cmd < 0:
            # 否则,位置p减少cmd-1
            p += cmd - 1
    else:
        # 如果输入的整数cmd不等于l,那么位置p增加cmd
        p += cmd
    # 更新最大位置变量mp
    mp = max(mp, p)

# 打印最大位置变量mp
print(mp)

C语言

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    int n, lucky;
    
    // 读取指令的总个数n和幸运数lucky
    scanf("%d", &n);
    scanf("%d", &lucky);

    // 检查n和lucky的值是否在指定范围内
    if (n < 1 || n > 100 || lucky < -100 || lucky > 100) {
        printf("12345\n");
        return 0;
    }

    int pos = 0; // 当前位置
    int maxPos = 0; // 记录最大位置

    // 遍历所有指令
    for (int i = 0; i < n; i++) {
        int cmd;
        scanf("%d", &cmd);

        // 检查指令值是否在指定范围内
        if (cmd < -100 || cmd > 100) {
            printf("12345\n");
            return 0;
        }

        // 如果指令值等于幸运数
        if (cmd == lucky) {
            // 根据指令正负决定如何处理步数
            if (cmd > 0) {
                pos += cmd + 1;
            } else if (cmd < 0) {
                pos += cmd - 1;
            }
        } else {
            // 正常处理指令
            pos += cmd;
        }

        // 更新最大位置
        if (pos > maxPos) {
            maxPos = pos;
        }
    }

    // 输出最大位置
    printf("%d\n", maxPos);

    return 0;
}

完整用例

用例1

9
-3
3 -3 -6 -3 -3 3 -3 -3 -3

用例2

20
10
5 10 -3 -10 5 10 1 2 3 -4 5 6 7 8 9 10 -1 -2 -3 -10

用例3

15
0
-1 0 1 2 3 4 5 6 7 8 9 10 11 12 13

用例4

12
5
1 2 3 4 -1 -2 -3 -4 1 2 3 4

用例5

10
2
3 4 5 6 7 8 9 10 11 12

用例6

20
-2
-2 -2 -3 -4 -5 -6 -7 -8 -9 -10 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10

用例7

7
7
1 7 -3 7 2 7 -1

用例8

4
8
9 6 5 -7

用例9

6
-5
-5 -6 0 -5 -7 -8

用例10

5
0
0 0 0 0 0

@[TOC]

fengmian