#4wa求助(玄关)

P1182 数列分段 Section II

ycy1124 @ 2024-04-09 19:20:14

#include<bits/stdc++.h>
using namespace std;
long long a[100001];
int main()
{
    long long n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        a[i]+=a[i-1];
    }
    long long l=0,ans,r=a[n]+1,mid;
    while(l<=r)
    {
        mid=(l+r)/2;
        long long js1=0,js2=0;
        long long i=0;
        while(i<=n)
        {
            if(a[i]-js1>=mid)
            {
                js2++;
                js1=a[i-1];
            }
            i++;
        }
        if(js2>=m)
        {
            l=mid+1;
            ans=mid;
        }
        else
        {
            r=mid-1;
            ans=mid-1;
        }
    }
    cout<<ans;
    return 0;
}

by Au_Gold @ 2024-04-13 22:53:52

@ycy1124 左边界不能是1,而是输入的数中的最大值


by ycy1124 @ 2024-04-15 12:42:43

@Au_Gold

具体怎么改求大佬指教


by Au_Gold @ 2024-04-16 13:43:07

@ycy1124 你的l=0错了,应该 l = 你输入的数据中的最大值


by Au_Gold @ 2024-04-16 13:44:11

@Au_Gold 我这句说错了,你的左边界不是1,是0


by ycy1124 @ 2024-04-16 13:47:08

@Au_Gold

我改了结果还是80


by 无痕 @ 2024-04-18 16:55:41

第i个数的值本身可能大于mid

if(a[i]-js1>=mid) //若a[i] - a[i-1]大于mid,此时的最大值显然不是mid而是a[i] - a[i-1]
{
  js2++;
  js1=a[i-1];
}

hack一组数据

input
5 4
1 2 3 4 5

output
5

|