题目大意:
m个人抄n份资料,资料有编号,每人抄连续的几份资料,每份资料页数不一定相等,每个人抄的速度相同,求使得总时间最少的方案(总时间相同,越前面的人抄的越少)
思路:
假设每人一天抄一页,二分天数,倒着安排资料即可。
代码:
#include<cstdio>
int n,m,l,r,i,p,a[],ans[]; bool check(int x)
{
int i=n,t=,cnt=;
for (;i>=;--i)
{
t=t+a[i];
if (t>x)
{
t=; ++i;
if (++cnt>m) return ;
}
}
if (t) t=;
return t+cnt<=m;
} int main()
{
scanf("%d%d",&n,&m);
for (i=;i<=n;i++) scanf("%d",&a[i]),r=r+a[i];
for (l=;l<r;)
{
int mid=l+r>>;
if (check(mid)) r=mid; else l=mid+;
}
r=,p=m;
for (i=n;i;--i)
{
r=r+a[i];
if (r>l)
{
r=;
ans[p--]=++i;
}
}
printf("1 %d\n",ans[p+]-);
for (i=p+;i<m;i++) printf("%d %d\n",ans[i],ans[i+]-);
printf("%d %d",ans[m],n);
return ;
}