80分,第四个点WA,有考虑到单个值大于二分值得情况,,问题在哪啊
查看原帖
80分,第四个点WA,有考虑到单个值大于二分值得情况,,问题在哪啊
331574
Mrfs楼主2023/6/25 09:56
#include<iostream>

using namespace std;

long long lst[100010],res = 1e9;
int n,m;

bool check(long long mid)
{   
    int nums = 0,cur = 0,nt = 1;
    while(cur < n)
    {
        bool flag = false;
        while(nt<=n && lst[nt]-lst[cur] <= mid)
        {
            nt ++;
            flag = true;
        }
        if(!flag) nt ++;  // 处理单个元素就比 mid 大的情况
        nums ++;
        cur = nt - 1;
        if(cur == n) break;
    }
    if(nums == m) res = min(res,mid);
    if(nums > m) return true;   // 值太小 分的段太多
    else return false;   // 等于 m 的情况也返回false 收拢 r  大于r的肯定不再是最优解
}

int main()
{
    cin >> n >> m;
    for(int i=1;i<=n;i++) cin >> lst[i];
    for(int i=1;i<=n;i++) lst[i] += lst[i-1];   // 前缀和

    long long l = 1, r = 1e9;
    while(l<r)
    {
        long long mid = (l+r+1) >> 1;
        if(check(mid)) l = mid;
        else r = mid - 1;
    }
    cout << res << endl;    

    return 0;
}
2023/6/25 09:56
加载中...