【ybtoj】【二分】【贪心】【例题1】数列分段

【例题1】数列分段


>link

传送门
题目


>解题思路

二分答案,然后贪心判断mid可不可行


>Code

#include <iostream>
#include <cstdio>

using namespace std;

int n, m;
long long l, r, mid, ans, a[100100];

bool check(long long x) {
    
    //贪心
	int k = 1;
	long long sum = a[1];
	for (int i = 2; i <= n; i++) {
    
    
		if (sum + a[i] <= x)
			sum += a[i];
		else {
    
    
			sum = a[i];
			k++;
		}
	}
	return (k <= m);
}

int main(){
    
    
	scanf ("%d%d", &n, &m);
	
	scanf ("%lld", &a[1]);
	l = r = a[1];
	for (int i = 2; i <= n; i++) {
    
    
		scanf ("%lld", &a[i]);
		r += a[i];
		l = max(l, a[i]);
	}
	while (l <= r) {
    
    
		mid = (l + r) / 2;
		if (check(mid))
			r = mid - 1, ans = mid;
		else
			l = mid + 1;
	}
	printf ("%lld", ans);
}

猜你喜欢

转载自blog.csdn.net/qq_39940018/article/details/111750032