题目描述
小明在玩一个游戏,游戏规则如下:
在游戏开始前,小明站在坐标轴原点处(坐标值为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
用例
输入 | 2 1 -5 1 |
输出 | 0 |
说明 |
总共2个指令,幸运数为1,按照指令行进,依次如下游戏开始前,站在坐标轴原点,此时坐标值为0; 指令为-5,后退5步,此时坐标值为-5; 指令为1,正好等于幸运数,前进1+1=2步,此时坐标值为-3; 整个游戏过程中,小明所处的坐标值依次为[0, -5, -3],最大坐标值为0。 |
输入 | 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。 |
题目解析
本题应该只是逻辑模拟题。逻辑比较简单,大家可以直接看代码。
本题主要是存在一些不明确的逻辑:
1、
幸运数为一个整数,如果某个指令正好和幸运数相等,则小明行进步数+1。
如果幸运数是0,且存在指令为0的情况,那么此时小明是行进步数是+1,还是-1,还是保持不动?
我理解是保持不动。
2、
输出描述中说:异常情况下输出:12345
本题应该没有啥异常情况,但是输入里面给了给个入参的范围限制,因此我做了对输入参数范围的校验,如果不满足,则输出异常码:12345
JS算法源码
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void (async function () {
const n = parseInt(await readline());
if (n < 1 || n > 100) {
// 异常情况下输出:12345
console.log("12345");
return;
}
const m = parseInt(await readline());
if (m < -100 || m > 100) {
// 异常情况下输出:12345
console.log("12345");
return;
}
let pos = 0;
let maxPos = 0;
const nums = (await readline()).split(" ").map(Number);
for (let num of nums) {
if (num < -100 || num > 100) {
// 异常情况下输出:12345
console.log("12345");
return;
}
pos += num;
if (num == m) {
// 如果某个指令正好和幸运数相等,则小明行进步数+1
// 注意,如果幸运数字为0,且存在指令为0,那么此时我理解小明应该继续保持不动
if (num > 0) {
pos += 1;
} else if (num < 0) {
pos -= 1;
}
}
// 比较本次移动后的坐标位置和最大坐标位置
maxPos = Math.max(maxPos, pos);
}
console.log(maxPos);
})();
Java算法源码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
if (n < 1 || n > 100) {
// 异常情况下输出:12345
System.out.println("12345");
return;
}
int m = sc.nextInt();
if (m < -100 || m > 100) {
// 异常情况下输出:12345
System.out.println("12345");
return;
}
int pos = 0;
int maxPos = 0;
for (int i = 0; i < n; i++) {
int num = sc.nextInt();
if (num < -100 || num > 100) {
// 异常情况下输出:12345
System.out.println("12345");
return;
}
pos += num;
if (num == m) {
// 如果某个指令正好和幸运数相等,则小明行进步数+1
// 注意,如果幸运数字为0,且存在指令为0,那么此时我理解小明应该继续保持不动
if (num > 0) {
pos += 1;
} else if (num < 0) {
pos -= 1;
}
}
// 比较本次移动后的坐标位置和最大坐标位置
maxPos = Math.max(maxPos, pos);
}
System.out.println(maxPos);
}
}
Python算法源码
def getResult():
n = int(input())
# 异常情况下输出:12345
if n < 1 or n > 100:
print("12345")
return
m = int(input())
# 异常情况下输出:12345
if m < -100 or m > 100:
print("12345")
return
pos = 0
maxPos = 0
nums = list(map(int, input().split()))
for num in nums:
# 异常情况下输出:12345
if num < -100 or num > 100:
print("12345")
return
pos += num
# 如果某个指令正好和幸运数相等,则小明行进步数+1
# 注意,如果幸运数字为0,且存在指令为0,那么此时我理解小明应该继续保持不动
if num == m:
if num > 0:
pos += 1
elif num < 0:
pos -= 1
# 比较本次移动后的坐标位置和最大坐标位置
maxPos = max(maxPos, pos)
print(maxPos)
getResult()
C算法源码
#include <stdio.h>
#define MAX(a,b) ((a) > (b) ? (a) : (b))
int main() {
int n;
scanf("%d", &n);
if (n < 1 || n > 100) {
// 异常情况下输出:12345
puts("12345");
return 0;
}
int m;
scanf("%d", &m);
if (m < -100 || m > 100) {
// 异常情况下输出:12345
puts("12345");
return 0;
}
int pos = 0;
int maxPos = 0;
for (int i = 0; i < n; i++) {
int num;
scanf("%d", &num);
if(num < -100 || num > 100) {
// 异常情况下输出:12345
puts("12345");
return 0;
}
pos += num;
if(num == m) {
// 如果某个指令正好和幸运数相等,则小明行进步数+1
// 注意,如果幸运数字为0,且存在指令为0,那么此时我理解小明应该继续保持不动
if(num > 0) {
pos += 1;
} else if(num < 0) {
pos -= 1;
}
}
// 比较本次移动后的坐标位置和最大坐标位置
maxPos = MAX(maxPos, pos);
}
printf("%dn", maxPos);
return 0;
}
免责声明:
评论0