POJ3273Monthly Expense

今天晚上cl叫我写的,我打开一看,一开始没什么思路,感觉很像DP,后来他说就二分就可以了。然后我突然想到这不就是四省赛热身赛的题么,而且白书上也有写题解。。o(︶︿︶)o 唉,题没做还是不熟悉。

因为是把天数化成连续的几段,所以把答案进行二分查找,每个答案可以用线性的时间判断对错,因此总的时间是nlogn。

#include <cstdio>
#include <cstring>
#include <iostream>
#define MAXN 100050
using namespace std;

int g[MAXN];
int s;
int N,M;

bool solve(int m){
	int len=1;
	int tt=0;
	for(int i=0;i<N;i++){
		if(tt+g[i]<=m)
		{
			tt=tt+g[i];
		}
		else
		{
			if(g[i]>m)return false;
			tt=g[i];len++;
		}
	}
	if(len<=M)
		return true;
	else return false;
}
int main(){

	while(scanf("%d%d",&N,&M)==2){
	s=0;
	for(int i=0;i<N;i++)
	{
		scanf("%d",&g[i]);
		s+=g[i];
	}
	int l=0,r=s;
	int ans=0;
	while(l<=r){
		int mid=(l+r)>>1;
		if(solve(mid)){
			ans=mid;
			r=mid-1;
		}
		else{
			l=mid+1;
		}

	}
	printf("%d\n",ans);
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/arbitrary/p/2622470.html