P1281 过了 SP 和 UVA 没过
#include <iostream>
#define big long long
using namespace std;
big T,n,m,maxn,sum,ans,plan[100005];
big a[100005];
bool check(big x)
{
big num = 1, tmp = 0;
for(big i = n;i >= 1;i--)
{
if(tmp+a[i] <= x)
{
tmp += a[i];
}
else
{
num++;
tmp = a[i];
}
}
return num > m;
}
int main()
{
scanf("%lld",&T);
while(T--)
{
sum = 0,maxn = 0;
scanf("%lld %lld",&n,&m);
for(big i = 1;i <= n;i++)
{
scanf("%lld",a+i);
maxn = max(maxn,a[i]);
sum += a[i];
}
big l = maxn, r = sum;
while(l < r)
{
big mid = (l+r) >> 1;
if(check(mid))
{
l = mid+1;
}
else
{
r = mid;
}
}
big tmp = 0,cnt = 1;
plan[1] = n;
bool flag = 0;
for(big i = n;i >= 1;i--)
{
if(flag == 0)
{
if(tmp+a[i] <= l)
{
if(tmp+a[i] == l)
{
flag = 1;
}
tmp += a[i];
}
else
{
plan[++cnt] = i;
tmp = a[i];
}
}
else
{
if(tmp+a[i] < l)
{
tmp += a[i];
}
else
{
plan[++cnt] = i;
tmp = a[i];
}
}
}
plan[cnt+1] = 0;
for(big i = cnt+1;i > 1;i--)
{
for(big j = plan[i]+1;j <= plan[i-1];j++)
{
printf("%lld",a[j]);
if(!(i == 2 && j == plan[1]))
{
putchar(' ');
}
}
if(i != 2)
{
printf("/ ");
}
}
printf("\n");
}
return 0;
}