题目
某软件系统会在运行过程中持续产生日志,系统每天运行 N 单位时间,运行期间每单位时间产生的日志条数保存在数组 records 中。records[i]表示第 i 单位时间内产生日志条数。由于系统磁盘空间限制,每天可记录保存的日志总数上限为 total 条。如果一天产生的日志总条数大于 total,则需要对当天内每单位时间产生的日志条数进行限流后保存, 请计算每单位时间最大可保存日志条数 limit,以确保当天保存的总日志条数不超过total,对于单位时间内产生日志条数不超过 limit 的日志全部记录保存;对于单位时间内产生日志条数超过 limit 的日志,则只记录保存 limit 条日志;如果一天产生的日志条数总
和小于等于 total,则不需要启动限流机制,result 为-1。
请返回 result 的最大值或者-1。
解答要求
时间限制:C/C++1000ms,其他语言:2000ms 内存限制:C/C++ 256MB,其他语
言:512MB
输入
第一行为系统某一天运行的单位时间数 N,1<=N<=10^5
第二行为表示这一天每单位时间产生的日志数量的数组 records, 0<= records[i]<=10^5 第三行为系统一天可以保存的总日志条数 total。 1 <= total<= 10^9
输出
每单位时间内最大可保存的日志条数 limit, 如果不需要启动限流限制,返回-1. 样例 1
输入:
6
3 3 8 7 10 15
40
输出:
9
解释:系统一天运行 6 单位时间,输出的总日志条数为 3+3+8+7+10+15=46,每天可保
存的日志总数上线为 40 条,需要进行限制,当天 result = 9 时,单位时间产生超过 9
条的日志只能保存 9 条日志,保存的总日志条数为:3+3+8+7+9+9=39,小于 40 条。
当 result =10 时,需要保存的日志条数为:3+3+8+7+10+10=41,超过了保存上限。所
以每单位时间最大保存日志条数为 9。
样例 2
输入:
5
3 3 5 7 9
40
输出:-1
解释:系统一天运行 5 单位时间产生的总日志条数为 3+3+5+7+9=27,小于一天可保
存的日志条数
总和,不需要进行限制,返回-1. 提示
1<=N <=10^5
0 <= records[i]<=10^5
1 <= total <=10^9
参考代码
考察二分查找,普通查找的话可能会超时
package RealTest;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;/*** @ClassName logFlowLimit* @Description TODO* @Author 21916* @Date 2024/3/14 9:20*/public class logFlowLimit {public static void main(String[] args) throws IOException {Scanner sc= new Scanner(System.in);int N= sc.nextInt();int[] arr =new int[N];for(int i=0;i<N;i++){arr[i] =sc.nextInt();}int total = sc.nextInt();if(Arrays.stream(arr).sum()<=total){System.out.println(-1);return ;}// 使用二分查找来确定合适的limitint left = 1; // 最小可能的limit,至少为1int right = 100000; // 最大可能的limit,根据题目条件为10^5int result = -1;while (left <= right) {int mid = left + (right - left) / 2;long currentLogs = calculateLogs(arr, mid);if (currentLogs <= total) {result = mid; // 当前limit可行,尝试增大limit看是否能找到更大的可行解left = mid + 1;} else {right = mid - 1; // 当前limit不可行,需要减小limit}}System.out.println(result);}public static long calculateLogs(int[] records, int limit) {long totalLogs = 0;for (int record : records) {totalLogs += Math.min(record, limit);}return totalLogs;}
}