快乐AK场2 D issue与lifehappy给学生分组 二分

链接:https://ac.nowcoder.com/acm/contest/11471/D
来源:牛客网

issue与lifehappy在给学生分组 现在他们手里有一组n分学生量化好的数据a 这份数据是一个数字,代表学生的大致实力
他们要给学生分成m组并且要求总实力和的最大值最小(ccpc抢名额战略,分散一点)
不过学生们已经拉帮结派的排好队了 所以 issue与lifehappy只能选取这组数据中的连续队列。
题解:二分最大值,线性求分组,通过和m的比较判断变大还是变小。

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int N=1e6+10;
int n,m;
ull a[N];
bool check(ull mid){
	ull sum=0;
	//for(int i=1,j=1;i<=n;i++){
	int j=1;int cnt=0; 
	while(j<=n){
		while(j<=n && sum+a[j]<=mid) {
			sum+=a[j];j++;
		}
		cnt++;sum=0;	
	}
	return m>=cnt;
	
}


int main(){
	ios::sync_with_stdio(false);
	cin>>n>>m;
	ull l=0,r=0;
	for(int i=1;i<=n;i++){
		cin>>a[i];l=max(l,a[i]);
		r+=a[i];
	}
	while(l<=r){
		ull mid=(l+r)>>1;
		if(check(mid)){//m>=cnt 
			r=mid-1;
		}else{
			l=mid+1;
		}
	}
	cout<<r+1<<endl;
	return 0;
} 
上一篇:字符串哈希


下一篇:黑龙江农垦科技职业学院喜迎寒假多校联赛2(快乐ak场)(D题详解)