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);
}
}
【数组】日志首次上报最多积分
于 2024-03-28 08:30:21 首次发布