算法:日志采集系统

一、算法描述
题目
日志采集是运维系统的的核心组件。日志是按行生成,每行记做一条,由采集系统分批上报。如果上报太频繁,
会对服务端造成压力;如果上报太晚,会降低用户的体验;如果一次上报的条数太多,会导致超时失败。
为此,项目组设计了如下的上报策略:
1、每成功上报一条日志,奖励1分
2、每条日志每延迟上报1秒,扣1分
3、积累日志达到100条,必须立即上报给出日志系统,
根据该规则,计算首次上报能获得的最多积分数。
输入
按时序产生的日志条数 T1,T2...Tn, 其中 1 ≤ n ≤ 1000, 0 ≤ Ti ≤ 100
输出描述
首次上报最多能获得的积分数
示例1
输入:1 98 1
输出:98
说明:采集系统第2个时刻上报,可获得最大积分(98 + 1) - 1 = 98

示例2
输入:50 60 1
输出:50
说明:如果第一个时刻上报,获得积分是50,如果第2个时刻上报,最多上报100条,
前50条延迟上报1秒,每条扣1分,共获得积分100 - 50 = 50
二、源码实现(Java)
public class LogCollectSys {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextLine()) {
            // 记录按时序产生的日志条数
            String[] logByTimeArr = scanner.nextLine().split(" ");
            int score = 0;    // 每个时刻上报的总积分
            int maxScore = 0; // 最大积分
            int count = 0;    // 日志条数
            for (int i = 0; i < logByTimeArr.length; i++) {
                score = 0;
                count += Integer.parseInt(logByTimeArr[i]);
                if (count >= 100) { // 必须上报
                    score = 100 - (count - Integer.parseInt(logByTimeArr[i]));
                    maxScore = Math.max(maxScore, score);
                    break;
                } else {
                    if (i == 0) {
                        score += count;
                    } else {
                        // 第二个时序后上报且总条数小于100时,需要减去延迟上报的扣减积分
                        score += count - (count - Integer.parseInt(logByTimeArr[i]));
                    }
                    maxScore = Math.max(maxScore, score);
                }
            }
            System.out.println(maxScore);
        }
    }
}
三、运行结果

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值