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

本文介绍了日志采集系统的上报策略,通过奖励积分和延迟扣分机制,计算给定日志序列下,首次上报能获得的最大积分。算法实现涉及日志累计、扣分计算和总分查找。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.io.*;
import java.util.Arrays;

/**
 * 日志首次上报最多积分
 * 日志采集是运维系统的核心组件。日志是按行生成,每行记做一条,由采集系统分批上报
 * 如果上报太频繁,会对服务端造成压力
 * 如果上报太晚,会降低用户的体验
 * 如果一次上报的条数太多,会导致超时失败。
 * 为此,项目组设计了如下的上报策略
 * 1、每成功上报一条日志,奖励1分
 * 2、每条日志每延迟上报1秒,扣1分
 * 3、积累日志达到100条,必须立刻上报
 * 给出日志序列,根据该规则,计算首次上报能获得的最多积分数
 * 输入描述
 * 按时序产生的日志条数T1,T2...Tn,其中 1 <= n <= 1000,0 <= Ti <= 100
 * 输出描述
 * 首次上报最多能获得的积分数
 */
public class MaximumPointsReported {
    /*
        1 98 1
        --------------
        98
        ++++++++++++++
        3 7 40 10 60
        --------------
        37
     */
    private static String line;
    private static String[] strArr;
    private static int[] logs = new int[1000];
    private static int length;
    public static void main(String[] args) throws IOException {

        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
        line = in.readLine();
        strArr = line.split(" ");
        length = strArr.length;
        for (int i = 0; i < length; i++) {
            logs[i] = Integer.parseInt(strArr[i]);
        }

        // 输出最大总分数
        out.println(maximumPointsReported());
        out.flush();
        in.close();
        out.close();
    }

    /**
     * 日志首次上报最多积分
     * @return  最大总分数
     */
    public static int maximumPointsReported(){
        //新建累积日志数组
        int[] accumulatedLogs = new int[length];
        //累计数组0号元素是日志0号元素
        accumulatedLogs[0] = logs[0];
        //新建扣分数组
        int[] penaltyScore = new int[length];
        //0号元素初始化为0
        penaltyScore[0] = 0;
        //新建积分数组
        int[] totalScore = new int[length];
        //积分数组0号元素是日志0号元素
        totalScore[0] = logs[0];
        // 遍历日志序列
        for (int i = 1; i < length; i++) {
            // 计算累计日志数量,不能超过100
            accumulatedLogs[i] = Math.min(100, accumulatedLogs[i - 1] + logs[i]);
            // 计算惩罚分数,每延迟上报1秒,扣1分
            penaltyScore[i] = penaltyScore[i - 1] + accumulatedLogs[i - 1];
            // 计算总分数,总分数 = 累计日志数量 - 惩罚分数
            totalScore[i] = accumulatedLogs[i] - penaltyScore[i];
            // 如果累计日志数量等于100,停止遍历
            if (accumulatedLogs[i] == 100) {
                break;
            }
        }
        // 找到最大的总分数
        return Arrays.stream(totalScore).max().orElse(Integer.MIN_VALUE);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值