[51nod-1128]正整数分组V2 题解

来源:互联网 发布:微信公众开发java教程 编辑:程序博客网 时间:2024/06/06 02:52

题目传送门
题目要求最小值最大,而且分组是连续的,那么就没什么好说的了,二分答案+线扫直接上。

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#define rep(i,a,n) for (int i=a;i<=n;i++)#define per(i,a,n) for (int i=a;i>=n;i--)#define Clear(a,x) memset(a,x,sizeof(a))#define ll long long#define INF 2000000000#define eps 1e-8#define db doubleusing namespace std;int read(){    int x=0,f=1;    char ch=getchar();    while (ch<'0'||ch>'9') f=ch=='-'?-1:f,ch=getchar();    while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();    return x*f;}const int maxn=50005;int n,m;ll l,r;ll a[maxn];bool check(ll mid){    ll sum=0,k=1;    rep(i,1,n){        if (sum+a[i]>mid) k++,sum=0;        if (k>m) break;        sum+=a[i];    }    return k<=m;}int main(){    n=read(),m=read();    rep(i,1,n) a[i]=read(),r+=a[i];    while (l<r){        ll mid=(l+r)>>1;        if (check(mid)) r=mid;            else l=mid+1;    }    printf("%lld\n",r);    return 0;}
原创粉丝点击