工资【二分】

>Description
在这里插入图片描述
在这里插入图片描述


>解题思路
这一道题我一开始做的时候想到了O(n^3)的DP,显然不是正解,本来想一下怎样优化DP,突然想到了二分答案真是sb这么二分答案的题我竟然想了这么久TT

二分可能的答案,按照答案进行分块,如果块的个数小于等于m,说明此答案可行(小于m的话可以再分几块,答案肯定还是可以的),否则不行


>代码

#include <iostream>
#include <cstdio>
#include <cstring>
#define N 100005
#define ll long long
using namespace std;

ll n, m, a[N], l, r, mid;

bool check (ll c)
{
	ll w = 0, p = 1;
	for (ll i = 1; i <= n; i++)
	{
		if (w + a[i] > c) w = a[i], p++;
		else w += a[i];
	}
	if (p <= m) return 1;
	return 0;
}

int main()
{
	scanf ("%lld%lld", &n, &m);
	for (ll i = 1; i <= n; i++)
	{
		scanf ("%d", &a[i]);
		r += a[i];
		l = max (l, a[i]);
	}
	while (l < r)
	{
		mid = (l + r) / 2;
		if (check (mid)) r = mid;
		else l = mid + 1;
	}
	printf ("%lld", l);
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值