#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 函数用于检查是否可以在最大页数为maxPages的情况下分配书籍
bool canAllocate(const vector<int>& pages, int n, int m, int maxPages) {
int studentCount = 1; // 学生计数
int currentSum = 0; // 当前学生的页数和
for (int i = 0; i < n; i++) {
// 如果当前书的页数加上当前学生的页数和超过最大页数
if (currentSum + pages[i] > maxPages) {
studentCount++; // 分配给下一个学生
currentSum = pages[i]; // 当前学生的页数和为当前书的页数
// 如果学生数量超过m,返回false
if (studentCount > m) {
return false;
}
} else {
currentSum += pages[i]; // 加入当前书的页数
}
}
return true; // 可以分配
}
// 主函数
int main() {
int t;
cin >> t; // 输入测试用例数量
while (t--) {
int n, m;
cin >> n >> m; // 输入书的数量和学生的数量
vector<int> pages(n);
for (int i = 0; i < n; i++) {
cin >> pages[i]; // 输入每本书的页数
}
// 二分搜索的范围
int low = *max_element(pages.begin(), pages.end()); // 最大单本书的页数
int high = accumulate(pages.begin(), pages.end(), 0); // 所有书的总页数
int result = high;
// 二分搜索
while (low <= high) {
int mid = low + (high - low) / 2; // 中间值
// 检查是否可以分配
if (canAllocate(pages, n, m, mid)) {
result = mid; // 记录结果
high = mid - 1; // 尝试更小的最大值
} else {
low = mid + 1; // 增加最大值
}
}
cout << result << endl; // 输出结果
}
return 0;
}
04-18
1000
09-24
934
09-29
139