CSU-1023修路(二分)

 要求最短时间,那么直接二分时间。

#include
#include
#include
#include
using namespace std;
const int maxn = 305;
const int mt= 300*1000+5;
int p[maxn];
bool judge(int m,int n,int t){
	int sum=0;
	int cn=1;
	for(int i=0;it) return 0;
		if(p[i]+sum<=t){
			sum+=p[i];
		}
		else{
			sum=p[i];
			cn++;
		}
	}
	if(cn<=n) return 1;
	else return 0;
}
int bsearch(int m,int n){
	int left=0,right=mt;
	int mid,ans=mt;
	while(left<=right)
	{
		mid=(right-left)/2+left;
		if(judge(m,n,mid))
		{
			ans=min(ans,mid);
			right=mid-1;
		}
		else{
			left=mid+1;
		}
	}
	return ans;
}
int main()
{
	int T,m,n;
	cin>>T;
	while(T--)
	{
		cin>>m>>n;
		memset(p,0,sizeof(p));
		for(int i=0;i>p[i];
		}
		cout<

 

你可能感兴趣的:(ACM)