大家好本蒟蒻又来了....
查看原帖
大家好本蒟蒻又来了....
13805
Ackoter楼主2020/7/25 21:47

题意是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;
}

很平常的二分答案题,但就是不知道该如何解决前面的人偷懒的问题,求奆佬帮助...

2020/7/25 21:47
加载中...