海口模板建站平台,济南网站建设行知科技不错,大连公司,如何制作一个简单的网页链接OD统一考试#xff08;C卷#xff09; 分值#xff1a; 100分 题解#xff1a; Java / Python / C 题目描述
机器人搬砖#xff0c;一共有N堆砖存放在N个不同的仓库中#xff0c;第 i 堆中有 bricks[i] 块砖头#xff0c;要求在8小时内搬完。
机器人每小时能搬砖的数量… OD统一考试C卷 分值 100分 题解 Java / Python / C 题目描述
机器人搬砖一共有N堆砖存放在N个不同的仓库中第 i 堆中有 bricks[i] 块砖头要求在8小时内搬完。
机器人每小时能搬砖的数量取决于有多少能量格机器人一个小时中只能在一仓库中搬砖机器人的能量格每小时补充一次且能量格只在这一个小时有效为使得机器人损耗最小化应尽量减小每次补充的能量格数。
为了保障在8小时内能完成砖任务请计算每小时始机器人充能的最小能量格数。
备注:
1、无需考虑机器人补充能量的耗时
2、无需考虑机器人搬砖的耗时
3、机器人每小时补充能量格只在这一个小时中有效
输入描述
程序有输入为“30 12 25 8 19”一个整数数组数组中的每个数字代表第i堆砖的个数每堆砖的个数不超过100
输出描述
输出在8小时内完成搬砖任务机器人每小时最少需要充多少个能量格
如果8个小时内无法完成任务则输出“-1”
示例1
输入
30 12 25 8 19输出
15示例2
输入
10 12 25 8 19 8 6 4 17 19 20 30输出
-1说明
砖的堆数为12堆存放在12个仓库中机器人一个小时内只能在一个仓库搬砖不可能完成任务题解 解题思路 题目要求机器人在8小时内搬完N堆砖每小时搬砖的数量取决于机器人每小时充能的能量格数。机器人每小时只能在一个仓库搬砖因此仓库数不能超过8。需要计算每小时机器人充能的最小能量格数使得能够在8小时内完成搬砖任务。使用二分查找的思想通过不断调整充能的能量格数找到一个最小的能量格数使得在8小时内能够完成搬砖任务。判断条件为每小时搬砖的天数是否小于等于8若是则说明当前充能的能量格数足够可以减小能量格数否则需要增加充能的能量格数。 Java
import java.util.Arrays;
import java.util.Scanner;
/*** author code5bug*/
public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);// 读取输入的砖块数int[] bricks Arrays.stream(in.nextLine().split( )).mapToInt(Integer::parseInt).toArray();// 机器人一个小时内只能在一个仓库搬砖, 因此仓库数不能超过 8if (bricks.length 8) {System.out.println(-1);} else {int l -1, r Arrays.stream(bricks).max().getAsInt();while (l 1 r) {int m (l r) 1;if (check(bricks, m)) {r m;} else {l m;}}System.out.println(r);}}// 判断机器人每小时充 power 能量能否在 8 个小时内搬完private static boolean check(int[] bricks, int power) {int days 0;for (int brick : bricks) {days (brick power - 1) / power;}return days 8;}
}
Python
from typing import Listdef check(bricks: List[int], power: int) - bool:判断机器人每小时充 power 能量能否在 8 个小时内搬完days 0for brick in bricks:days (brick power - 1) // powerreturn days 8if __name__ __main__:bricks list(map(int, input().split()))if len(bricks) 8: # 机器人一个小时内只能在一个仓库搬砖,因此仓库数不能超过 8print(-1)else:l, r -1, max(bricks)while l 1 r:m (l r) 1if check(bricks, m):r melse:l mprint(r)
C
#include iostream
#include vector
#include algorithmusing namespace std;// 判断机器人每小时充 power 能量能否在 8 个小时内搬完
bool check(const vectorint bricks, int power) {int days 0;for (int brick : bricks) {days (brick power - 1) / power;}return days 8;
}int main() {vectorint bricks;int brick;while (cin brick) {bricks.push_back(brick);}// 机器人一个小时内只能在一个仓库搬砖, 因此仓库数不能超过 8if (bricks.size() 8) {cout -1 endl;} else {int l -1, r *max_element(bricks.begin(), bricks.end());while (l 1 r) {int m (l r) / 2;if (check(bricks, m)) {r m;} else {l m;}}cout r endl;}return 0;
}
相关练习题
题号题目难易LeetCode 16311631. 最小体力消耗路径中等LeetCode 22262226. 每个小孩最多能分到多少糖果中等 ❤️华为OD机试面试交流群每日真题分享 加V时备注“华为od加群” 整理题解不易 如果有帮助到您请给点个赞 ❤️ 和收藏 ⭐让更多的人看到。