题目链接:UVA 714
#include<cstring>
#include<string>
#include<iostream>
using namespace std;
const int maxn = 10000000 + 5;
int n, m;
long long _max,left,right,_min;
int a[maxn];
int ans[510];
bool judge(long long mid) //判断能否每组都小于等于mid
{
long long sum = 0;
int t = 1;
for (int i = n - 1; i >= 0; i--)
{
if (sum + a[i] > mid)
{
sum = a[i];
t++;
if (t > m) return false; //需要分的组数大于了给定的m组,返回false
}
else
sum += a[i];
}
return true;
}
void solve()
{
memset(ans, 0, sizeof(ans));
::left = _min, ::right = _max;
while (::left <= ::right)
{
long long mid = (::left + ::right) / 2;
if (judge(mid))
{
::right = mid - 1;
}
else ::left = mid + 1;
}
long long sum = 0;
int count = 1;
for (int i = n - 1; i >= 0; i--)
{
if (sum + a[i] > ::left)
{
sum = a[i];
ans[i] = 1;
count++;
}
else
sum += a[i];
if (m - count == i + 1) //如果剩下来的值数量正好等于要划分的组数,那么一个数为一组
{
for (int j = 0; j <= i; j++)
ans[j] = 1;
break;
}
}
for (int i = 0; i < n - 1; i++)
{
cout << a[i] << " ";
if (ans[i]) cout << "/ ";
}
cout << a[n - 1] << endl;
}
int main()
{
//freopen("D:\\txt.txt", "r", stdin);
int t;
cin >> t;
while (t--)
{
cin >> n >> m;
_min = 0;
_max = 0;
for (int i = 0; i < n; i++)
{
cin >> a[i];
if (_min < a[i]) _min = a[i];
_max += a[i];
}
solve();
}
return 0;
}