题目
总工程师
题目描述
有M个软件工程师正在完成一个大型软件,需要开发若干个组件。 已知完成每个组件的开发时间保存在一个数组A里面,每个工程师只能独立完成连续的组件, 并且所有的工程师都是并行工作, 请输出完成这个软件需要的最少时间
输入说明
程序从当前路径下的data.txt文件中读取测试数据。
第一行会有1个数值,表示M
第二行则是A数组,元素之间以空格隔开
输出说明
向标准输出打印完成软件需要的最少时间
示例
输入:
2
3 1 4
表示有两个工程师来完成3 个组件。 3个组件耗时分别是3/1/4.
输出:
4
最好的分配方式为第一个工程师完成组件 1,2, 所以需要时间为4; 第二个工程师完成3, 所需要时间为4, 因为并行工作, 所以最小时间是4.
思路
- 注意每个工程师只能独立完成连续的组件,故该题实际就是对序列进行划分,设划分M个序列后的最大子序列和为value,则题目需要找到一个最小的value。
- 而且时间肯定是正的,那么不需要考虑负数序列。
- 那么可以用贪心去解决了:假设正确答案是V,我们就假设一个值value去逼近V,直到用value可以划分M个序列,而value-1不能划分M个序列,此时value值即为V。
- 时间复杂度:O(n^2)
代码
#include <iostream>
#include <fstream>
using namespace std;
int m, n, a[1024];
bool judge(int value) {
int sum = 0, cnt =