题意是n个数,切成k段,要求尽量使每段总和中的最大值最小,相同结果下使前面的人干的越少越好。输出每人干的区间。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<list>
#include<map>
using namespace std;
int l=0,r=1000001,mid,n,k,a[501],lj;
bool finds(int mid)
{
int lj2=0,k2=1;
for(int i=1;i<=n;i++)
{
lj2+=a[i];
if(lj2>mid) k2++,lj2=a[i];
}
return k2>k;
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
while(l<=r)
{
mid=(l+r)/2;
if(finds(mid)) l=mid+1; else r=mid-1;
}
printf("1 ");
for(int i=1;i<=n;i++)
{
lj+=a[i];
if(lj>l) {printf("%d\n%d ",i-1,i);lj=a[i];}
}
printf("%d",n);
return 0;
}
很平常的二分答案题,但就是不知道该如何解决前面的人偷懒的问题,求奆佬帮助...