社区讨论
额,虽然过了,但还是有点问题
P1182数列分段 Section II参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mi6hesvr
- 此快照首次捕获于
- 2025/11/20 04:55 4 个月前
- 此快照最后确认于
- 2025/11/20 04:55 4 个月前
CPP
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<cmath>
#include<stdlib.h>
#define INF 0x3f3f3f3f
#define MAXN 1000002
using namespace std;
int n,m;
int sum=0;
int a[MAXN];
int l,r;
bool check(int s)
{
int tot=0,num=1;
for (int i=1;i<=n;i++)
{
tot+=a[i];
if (a[i]>s)
return 0;
if (tot>s)
{
tot=a[i];
num++;
if (num>m)
return 0;
}
}
return num<=m;
}
int main()
{
scanf("%d%d",&n,&m);
l=INF,r;
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
l=min(l,a[i]);
}
r=sum;
while (l+1<r)
{
int mid=(l+r)>>1;
if (check(mid))
r=mid;
else
l=mid;
}
for (int i=l;i<=r;i++)
if (check(i))
l=i;
printf("%d\n",l);
return 0;
}
这是AC代码
但是把while里的条件改一改,改成l+2<r,就只有80分了。
一开始还想着再放宽一点好了,改成l+4<r,结果只有20分了。
后来改成l+1<r,就AC了。为什么会这样?稍微放宽一点为什么会错呢?
回复
共 3 条回复,欢迎继续交流。
正在加载回复...