这道题WA了三次,最初是一个逻辑上的小问题,改了之后心里觉得就AC了,可是还是WA,后来发现是最后我判断的标准和别人的不一样。
我觉得应该是 找出每一种满足划分条件的 区间和最大值,然后再在这些最大值之中找出最小值就是结果。
但是这样做是WA的,我好郁闷,这样想没错吧?!
我看过了的人都是找到二分循环跳出时的mid值。
AC代码如下,如果将其中注释掉的语句加上,就是我一开始的思路,但是WA了。也许是我逗比了,但是真的想不通为什么不对?
希望大神帮忙指出错误之处,不胜感激。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAX 101111
using namespace std;
int N,m,L,R=0,M,sum,cnt,ans,mid;
int a[MAX];
int main()
{
int i,j;
scanf("%d%d",&N,&m);
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);
R+=a[i];
if(a[i]>L) L=a[i];
}
ans=R;
mid=(L+R)/2;
while(L<R) //二分循环
{
M=0;cnt=0;sum=0;
for(i=0;i<N;i++) //划分区间
{
sum+=a[i];
if(sum>mid)
{
sum-=a[i];
if(sum){
// M=max(M,sum);
cnt++;
}
sum=a[i];
}
}
if(sum){
// M=max(M,sum);
cnt++;
}
if(cnt==m) //满足划分条件
{
//ans=min(ans,M);
R=mid;
mid=(L+R)/2;
}
else if(cnt<m)
{
R=mid;mid=(L+R)/2;
}
else {
L=mid+1;mid=(L+R)/2;
}
}
//printf("%d\n",ans;
printf("%d\n",mid);
return 0;
}