为嘛最后还要check一次
查看原帖
为嘛最后还要check一次
575850
RemainThrive楼主2021/10/22 18:04
#include <bits/stdc++.h>
#define ll long long
ll n, d, ans, sum, left, right, result, happy[50010], day[50010]; 
bool check(ll target)
{
    ans = 0;
    sum = 0;
    for (int i = 1; i <= d; i++)
    {
        ans >>= 1;
        while (ans < target)
        {
            sum++;
            ans += happy[sum]; 
            day[sum] = i;
            if (sum > n)
            return false;
        }
    }
    if (sum < n)
    {
        for (int i = sum+1; i <= n; i++)//sum这个巧克力已经吃过了, 所以要换下一个
        day[i] = d;
    }
    return true;
}
int main(void)
{
    scanf("%d %d", &n, &d);
    left = 0;
    right = 0;
    for (int i = 1; i <= n; i++)
    {
        scanf("%lld", &happy[i]);
        right += happy[i];
    }
    while (left < right)
    {
        ll mid = left + right + 1 >> 1;
        if (check(mid))
        {
            left = mid;
            result = mid;
        }
        else
        right = mid -1;
    }
    check(result);
    printf("%lld\n", result);
    for (int i = 1; i <= n; i++)
    printf("%lld\n", day[i]);
    return 0;
}
//二分幸福值,判定该值是否可行

虽然在看了很多大佬后,终于找到最适合自己的一条思路做了,但还是不理解为什么要在最后再check一次,求教各位大佬

2021/10/22 18:04
加载中...