思路:这题应该来说比lightoj1048简单多了,,,有n个输奶管,里面有一定的牛奶,现在有m个存储罐用来装这些牛奶,规则是一个管子里面的牛奶不能分开装,多个管子里面的牛奶可以混合装,混装的时候只能按照给定的顺序装,求满足条件的单个罐子的最小容积。显然是二分容积值,low = max(A[i],A[i + 1]),high = A[1] + [2] + ... + A[n]。
// #pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <sstream>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <map>
#include <set>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <climits>
using namespace std;
// #define DEBUG
#ifdef DEBUG
#define debug(...) printf( __VA_ARGS__ )
#else
#define debug(...)
#endif
#define CLR(x) memset(x, 0,sizeof x)
#define MEM(x,y) memset(x, y,sizeof x)
#define pk push_back
template<class T> inline T Get_Max(const T&a,const T&b){return a < b?b:a;}
template<class T> inline T Get_Min(const T&a,const T&b){return a < b?a:b;}
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> ii;
const double eps = 1e-10;
const int inf = 1 << 30;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const int maxn = 1010;
int A[maxn];
int n, m;
bool check(int x){
int sum = 0, ans = 0;
for (int i = 1;i <= n;++i){
while(sum + A[i] <= x && i <= n){
sum += A[i];
i++;
}
ans++;
i--;
sum = 0;
}
// cout << "mid = " << x << endl;
// cout << "ans = " << ans << endl;
return ans <= m;
}
int Solve(int low,int high){
int ans;
while(low < high){
int mid = (low + high) / 2;
if (check(mid)) {
high = mid;
}
else low = mid + 1;//ans > n
}
return high;
}
int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int t, icase = 0;
scanf("%d",&t);
while(t--){
int high = 0, low = 0;
scanf("%d%d",&n,&m);
for (int i = 1;i <= n;++i){
scanf("%d",&A[i]);
high += A[i];
low = max(low, A[i]);
}
int ans = Solve(low, high);
printf("Case %d: %d\n", ++icase, ans);
}
return 0;
}