感谢你能点进来。
这个蒟蒻现在在怀疑自己的二分板子..所以如果你能帮助我,那么感激不尽。
#include<cstdio>
#include<iostream>
#define rg register
#define il inline
#define MAXN 100010
using namespace std;
template <typename T> il void init(T &x)
{
char c;
while((c=getchar())<'0' || c>'9');
x = c^48;
while((c=getchar())>='0' && c<='9') x = (x<<1) + (x<<3) + (c^48);
}
template <typename T> void outit(T x)
{
if(x > 9) outit(x/10);
putchar(x%10^48);
}
//------------------------快读快写----------------------------
int n, m, a[MAXN];
il bool check(int x)
{
//int cur=0, num=1;//WA
int cur=0, num=0;//AC
/*此处对这道题来说我不是很明白num初值为什么取0,我觉得这样会少计算一块(比如x远远大于cur时num恒为0而实际上num==1)*/
for(rg int i=1 ; i<=n ; ++i)
{
cur += a[i];
if(cur>x)
{
++num;
cur = a[i];
}
}
return num >= m;
}
/*
il int binary(int l, int r) //WA
{
while(l != r)
{
int mid = (l+r+1)>>1;
if(check(mid)) l=mid;
else r=mid-1;
}
return l;
}*/
/*二分WAWAWA*/
il int binary(int l, int r)//AC
{
while(l <= r)
{
int mid = (l+r)>>1;
if(check(mid)) l=mid+1;
else r=mid-1;
}
return l;
}
int main()
{
init(n), init(m);
int l=0, r=0;
for(rg int i=1 ; i<=n ; ++i)
{
init(a[i]);
if(a[i] > l) l = a[i];
r += a[i];
}
outit(binary(l, r));
return 0;
}
完了二分都不会写了
谢谢你