华为OD机试真题 JavaScript 实现日志首次上报最多积分2023 Q1 | 100分

Posted MISAYAONE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为OD机试真题 JavaScript 实现日志首次上报最多积分2023 Q1 | 100分相关的知识,希望对你有一定的参考价值。

   所有题目均有四种语言实现。C++ 实现目录Python实现目录Java实现目录JavaScript实现目录

题目

题目描述
日志采集是运维系统的的核心组件。日志是按行生成,每行记做一条,由采集系统分批上报。
如果上报太频繁,会对服务端造成压力;如果上报太晚,会降低用户的体验;如果一次上报的条数太多,会导致超时失败。为此,项目组设计了如下的上报策略:
1、每成功上报一条日志,奖励1分
2、每条日志每延迟上报1秒,扣1分
3、积累日志达到100条,必须立即上报
给出日志序列,根据该规则,计算首次上报能获得的最多积分数

输入描述:

按时序产生的日志条数 T1,T2...Tn,其中 1<=n<=1000,0<=Ti<=100
输出描述: 
首次上报最多能获得的积分数

示例1 输入输出示例仅供调试,后台判题数据一般不包含示例
输入
1 98 1
输出  
98

说明:

T1 时刻上报得 1 分

T2 时刻上报得98分,最大

T3 时刻上报得 0 分

示例2 输入输出示例仅供调试,后台判题数据一般不包含示例
输入
3 7 40 10 60 
输出  

37

说明:

T1 时刻上报得 3 分

T2 时刻上报得 7 分

T3 时刻上报得 37 分,最大

T4 时刻上报得 -3 分

T5 时刻上报,因为已经超了100条的限制,所以只能上报100条,得 -23 分

 

思路

1:说实话这个题理解起来很费劲,读懂题意也就是这个题最大的难度了。

2:就用例子2来说明,因为累计100条就必须上报了,首次上报的条件很容易达成。

T1时刻不用说,

T2时刻上报,当前为7条,前一秒为3条,总共10条,上报得10分,但是T1的 3条超时了1秒,所以减3分,最后得到7分。

T3时刻上报,当前为40条,加上前两秒的,总共50条,上报得50分,但是T2的 7条超时了1秒,减7分,T1的3条超时了2秒,减6分,最后得37分。

依次类推。

JS输入输出

javascript 本身有两种模式:V8 和 Node,两种模式在输入上略有不同。

Node:

let readline = require("readline");
 
const rl = readline.createInterface(
  input: process.stdin,
  output: process.stdout,
);

rl.on('line', function(line)
    // line表示的就是输入的一行
    let lines = line.split(' ').map(Number);
);

V8:

//假设输入为:
4
5
1 2

// readline() 就表示输入的一行,和python中的 input()函数用法基本一致
let n = readline().split('').map(item=>parseInt(item));  // 4
let k = readline().split(' ').map(item=>parseInt(item)); // 5
let [nums] = readline().split(' ').map(item=>parseInt(item)); // 1 2

具体我也是参考了网上的博主的文章:ACM模式下JavaScript(js)的输入输出 V8 Node_我先润了的博客-CSDN博客

ACM格式javascript 输入输出 - 衣囧~ - 博客园 (cnblogs.com)

不熟悉的可以自行查阅。

这里给出这位博主的总结:

        node.js=V8+内置基本模块,相当于java中的JRE=JVM+java标准库

        node就是带有能操作IO和网络库的V8引擎,提供了很多可调用的API使得JavaScript能够读写文件,网络请求,系统信息等操作。对V8引擎进行了封装,执行JavaScript的速度更快,性能更好。

Code

//JSRUN引擎2.0,支持多达30种语言在线运行,全仿真在线交互输入输出。
function main(input_str) 
    //转数字数组
    let nums = input_str.split(" ").map(Number)
    
    // 得分
    let plus_score = [nums[0]]
    // 扣分
    let minus_score = [0]
    // 总得分
    let score = [nums[0]];
    for (let i = 1; i < nums.length; i++) 
        plus_score[i] = Math.min(100, plus_score[i - 1] + nums[i])
        minus_score[i] = minus_score[i - 1] + plus_score[i - 1]
        score[i] = plus_score[i] - minus_score[i]

        if (plus_score[i] >= 100) 
            break
        
    
    
    console.log(Math.max.apply(null, score))

 
main("3 7 40 10 60")

要求

时间限制:C/C++ 1秒,其他语言 2秒

空间限制:C/C++262144K,其他语言524288K

64bit IO Format:%lld

语言限定:
C(clang11), C++(clang++11), Pascal(fpc 3.0.2), Java(javac 1.8), Python2(2.7.3), 
php(7.4.7), C#(mcs5.4), ObjC(gcc 5.4), Pythen3(3.9), JavaScript Node(12.18.2), JavaScript V8(6.0.0),
Sqlite(3.7.9), R(4.0.3), Go(1.14.4), Ruby(2.7.1), Swift(5.3), matlab(Octave 5.2), Pypy2(pypy2.7.13),
Pypy3(pypy3.6.1), Rust(1.44), Scala(2.11.12), Kotlin(1.4.10), Groovy(3.0.6), TypeScript(4.1.2), mysql(8.0)

以上是关于华为OD机试真题 JavaScript 实现日志首次上报最多积分2023 Q1 | 100分的主要内容,如果未能解决你的问题,请参考以下文章

华为OD机试真题 JavaScript 实现日志限流2023 Q1 | 100分

华为OD机试真题Java实现日志采集系统真题+解题思路+代码(2022&2023)

华为OD机试真题 C 实现日志限流2023 Q1 | 100分

华为OD机试真题 JS 实现寻找相似单词2023 Q1 | 100分

华为OD机试真题Java实现简易内存池2真题+解题思路+代码(2022&2023)

华为OD机试真题 Java 实现单词接龙