Monthly Expense(最大值最小化问题)

#include <iostream>
using namespace std;
//const int maxn = 1e5+10;
int sum=0;
int n,m;
int arr[100010];

bool fun(int mid1){
	int sum1=0;
	int cnt=0;
	int j;
	for(j=1;j<=n;j++){
		//有越界了,直接滚回去重开,你这就不算最大的最小值了
		if(arr[j]>mid1){
			return true;
		}
		//如果超过了它的大小,建议分个组
		sum1+=arr[j];
		if(sum1>mid1){
			cnt++;
			sum1=0;
			j--;
		}
	}
	//出来了,你要是有多的就再分个组
	if(sum1){
		cnt++;
	}
	if(cnt>m){
		return true;
	}else{
		return false;
	}
}
int main() {
	int i,l,r,mid;
	cin>>n>>m;
	for(i=1;i<=n;i++){
		cin>>arr[i];
		sum+=arr[i];
//		printf("%d\n",sum);
	}
	l = 0,r = sum;
	while(l<=r){
		mid = (l+r)/2;
		if(fun(mid)){
			l = mid + 1; 
		}else{
			r = mid - 1;
		}
	}
	cout<<l;
	return 0;
}

题解:

注意不要重复定义变量,否则会debug两小时,发现自己啥都没做出来(

思路就是首先判断会不会越界,会不会比需要的大,大了就分一组,然后看组数和吗的关系

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值