算法每一题,成长每一天~
C0E10 日志采集系统
真题链接:【持续更新】2024华为 OD 机试E卷 机考真题库清单(全真题库)
思路
这题常规思路,就是每过一秒,前面的日志多扣一倍的分,可以这样逐个加减计算得分。
这里使用了折算的方式,即前面无论多少秒的日志,它们的得分都累计到上一秒;然后这一秒的得分只看上一秒的数据(得分,总条数)。这样会少一层循环处理。
Java
import java.util.Scanner;
public class C0E10 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int[] nums = new int[1_000];
int idx = 0;
String[] split = in.nextLine().split(" ");
for (String s : split) {
nums[idx++] = Integer.parseInt(s);
}
int[] scores = new int[idx + 1]; // 得分
int[] counts = new int[idx + 1]; // 总条数
scores[0] = 0;
counts[0] = 0;
int maxScore = 0;
for (int i = 1; i <= nums.length; i++) { // 逐秒计算
int thisNum = nums[i - 1]; // 这一秒的日志数,为数组的第 i-1个元素
// 这次提交的得分
scores[i] = scores[i - 1] // 上次剩余得分
- 1 * counts[i - 1] // 上次总日志数,到这一次为每条扣一分
+ 1 * Math.min(thisNum, 100 - counts[i - 1]); // 这次的提交得分,每条日志加一分,最多100条
// 累计条数
counts[i] = counts[i - 1] + thisNum;
// 最大得分
maxScore = Math.max(maxScore, scores[i]);
if (counts[i] >= 100) {
break;
}
}
System.out.println(maxScore);
}
}
总结
1、这一题很容易想到的就是一秒一秒的计算。但其实打打草稿就会发现更便捷的公式。
算法要多练多练多练!!