华为OD机试真题【日志首次上报最多积分】

1、题目描述

【日志首次上报最多积分】

日志采集是运维系统的的核心组件。日志是按行生成,每行记做一条,由采集系统分批上报。

如果上报太频繁,会对服务端造成压力;如果上报太晚,会降低用户的体验;

如果一次上报的条数太多,会导致超时失败。为此,项目组设计了如下的上报策略:

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、参考代码

import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;

public class 日志首次上报最多积分 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            List<Integer> logs = Arrays.stream(in.nextLine().split(" "))
                    .map(Integer::parseInt)
                    .collect(Collectors.toList());

            int[] accLogs = new int[logs.size()];
            accLogs[0] = logs.get(0);

            int[] penaltyScore = new int[logs.size()];
            penaltyScore[0] = 0;

            int[] totalScore = new int[logs.size()];

            for (int i = 1; i < logs.size(); i++) {
                // 计算累计日志数量,不能超过100
                accLogs[i] = Math.min(100, accLogs[i - 1] + logs.get(i));
                // 计算惩罚分数,每延迟上报1秒,扣1分
                penaltyScore[i] = penaltyScore[i - 1] + accLogs[i - 1];
                // 计算惩罚分数,总分数 = 累计日志数量 - 惩罚分数
                totalScore[i] = accLogs[i] - penaltyScore[i];

                // 如果日志数量大于等于100,停止遍历
                if (accLogs[i] >= 100) {
                    break;
                }
            }
            int maxScore = 0;
            for(int item : totalScore) {
                if (item > maxScore) {
                    maxScore = item;
                }
            }

            System.out.println(maxScore);
        }
    }

}

4、相似题目

(1)最大利润

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值