题目描述
机器人搬砖,一共有 N 堆砖存放在 N 个不同的仓库中,第 i 堆砖中有 bricks[i] 块砖头,要求在 8 小时内搬完。
机器人每小时能搬砖的数量取决于有多少能量格,机器人一个小时中只能在一个仓库中搬砖,机器人的能量格只在这一个小时有效,为使得机器人损耗最小化,应尽量减小每次补充的能量格数。
为了保障在 8 小时内能完成搬砖任务,请计算每小时给机器人充能的最小能量格数。
- 无需考虑机器人补充能力格的耗时;
- 无需考虑机器人搬砖的耗时;
- 机器人每小时补充能量格只在这一个小时中有效;
输入描述
第一行为一行数字,空格分隔
输出描述
机器人每小时最少需要充的能量格,若无法完成任务,输出 -1
用例1
输入
30 12 25 8 19
Copy
输出
15
Copy
用例2
输入
10 12 25 8 19 8 6 4 17 19 20 30
Copy
输出
-1
Copy
说明
砖的堆数为12堆存放在12个仓库中,机器人一个小时内只能在一个仓库搬砖,不可能完成任务。
#include <algorithm>
#include <string>
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
int main() {
int a = 0;
vector<int> vec;
while (cin >> a)
{
vec.push_back(a);
if (cin.peek() == '\n')
break;
}
if (vec.size() > 8) {
cout << -1 << endl;
return 0;
}
int max = *max_element(vec.begin(), vec.end());
if (vec.size() == 8) {
cout << max << endl;
return 0;
}
//二分法
int min = 1;
int midd = (max + min) / 2;
int result = max;
while (min < max)
{
int count = 0;
for (int val : vec)
{
count += val / midd;
if (val % midd > 0) {
count++;
}
}
if (count <= 8){
max--;
result = std::min(result, midd);
}
else {
min++;
}
midd = (max + min) / 2;
}
cout << result << endl;
return 0;
}
测评通过率100%。
有一个地方可以优化:前后两次循环midd可能会存在相等的情况,可以加上判断,相等的话就继续执行max-- 或min-- .