华为OD机试真题2026双机位C卷 C++实现【日志解析】

发布时间:2026/5/20 5:40:07

华为OD机试真题2026双机位C卷 C++实现【日志解析】 日志解析其它编程语言题解点击跳转华为OD机试双机位C卷:日志解析C/C/Java/Python/Go/JS2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 200分题型华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录机考题库 算法考点详解题目描述你是一个运维工程师你同时负责n个系统的运维工作已知每个系统每天会都从现场采集大量的现网运行日志错误日志、接口日志等下来生成一个日志文件每个系统采集下来的日志文件大小均不相同。为了解析这些日志你给每个系统配备了一台默认服务器进行日志解析且此台服务器只能给本系统使用由于所配置的服务器规则均相同因为解析日志的速度也是相同的即每秒钟可以解析defaultCnt条日志。现在你发现解析的速度达不到预期但你手头上还有一部分额外的资源可以使用这些资源可以在任意时刻配置给任意一台服务器。但有个限制那就是同一时刻只能配给其中一台服务器器且服务器器是能整合全部额外资源当然在下一秒钟即可配备给另外一台服务器。某一台服务器配备了额外资源以后则每秒钟会增加解析extraCnt条日志即每秒可解析defaultCntextraCnt条日志。输入描述输入一共2行第一行为3个正整数n、defaultCnt、extraCnt第二行为n个正整数a1a2…an分别表示每个系统采集的日志条目数已知1 ≤ n ≤ 1×10⁵1 ≤ defaultCnt, extraCnt ≤ 1001 ≤ ai ≤ 1000输出描述一个正整数表示解析完成全部日志的最少时间。用例1输入3 2 1 1 2 3输出1说明每个服务器每秒可解析2条日志直接将额外的资源配备给第三台服务器器则第三台服务器每秒可解析213条日志则只需1秒即可解析完三个系统的全部日志。用例2输入1 1 1 4输出2题解思路二分经典的二分题型一般题目背景为在...限制下..求最大/最小类问题可以考虑使用二分实现。定义二分边界下边界可直接设置为0left 0,至于上边界考虑数据边界不使用加速情况下最大时间为right (max(a) defaultCnt - 1) / defaultCnt.注意上下取整。接下来就是二分经典套路枚举中间值(mid (left right)),判断在指定时间内是否可以完成所有日志收集更新边界直到left right结束此时left就是最小结果。可以完成更新上边界为right mid不可以完成更新left mid 1判断是否可行采用贪心逻辑题目中说明同一时刻只能配给其中一台服务器器,这就转换为在时间T内完成所有任务需要的加速次数是否 T. 对于每个日志文件需要的加速次数计算逻辑如下:每个日志默认自行可完成base T * defaultCnt, 那么当a[i] base是需要加速次数为(a[i] - base extraCnt - 1) / extraCnt. 累加所有任务加速次数如果totalNeed T则能完成反之则不能。Code#includeiostream #includevector #includestring #include utility #include sstream #includealgorithm #includecmath #includemap using namespace std; int n, defaultCnt, extraCnt; // 贪心判断 bool check(vectorinta , int time) { // 总共需要加速时长 int totalNeed 0; int base time * defaultCnt; for (int i 0; i n; i) { if (a[i] base) { // 额外需要加速时间,向上取整 int need (a[i] - base extraCnt - 1) / extraCnt; totalNeed need; if (totalNeed time) { return false; } } } return totalNeed time; } int main() { cin n defaultCnt extraCnt; vectorint a(n); int left 0, right 0; for (int i 0; i n; i) { cin a[i]; // 向上取整上边界确定为不采用加速原始需要的时间 right max(right, (a[i] defaultCnt -1) /defaultCnt); } // 二分 while (left right) { int mid (left right) 1; if(check(a, mid)) { right mid; } else { left mid 1; } } cout left; return 0; }

相关新闻