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)最大利润