题解 | #Shopee的零食柜#

Shopee的零食柜

http://www.nowcoder.com/practice/24a1bb82b3784f86babec24e4a5c93e0

虽然数据的通过情况是4 / 7,但我怀疑是数据的问题,如果是代码的问题,那么请大佬们一定要为我指出,感谢!

题意:一个长度为n的序列,最多“切割(即连续地划分)”成m组,对这些组分别求组内元素和,问这些组内元素和的最小值是多少。

思路:二分答案

代码:

#include <iostream>
using namespace std;

const int N = 1000010;
int n, m;
int a[N];

bool check (int x) { // 判断答案为 x 时可不可以
    int sum = 0, cnt = 0;
    for (int i = 1; i <= n; ++ i) { // 简单的划分过程
        if (sum + a[i] <= x) {
            sum += a[i];
        } else {
            ++ cnt;
            sum = a[i];
        }
    }
    ++ cnt;
    return cnt <= m;
}

int main () {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; ++ i) scanf("%d", &a[i]);

    int l = 0, r = 0;
    for (int i = 1; i <= n; ++ i) { // 确定二分的上下界
        l = max(l, a[i]);
        r += a[i];
    }
    while (l < r) {
        int mid = l + r >> 1;
        if (check(mid) == true) {
            r = mid;
        } else {
            l = mid + 1;
        }
    }
    printf("%d", l);
    return 0;
}
全部评论
全被然然吃完了🤣
1 回复 分享
发布于 2021-08-25 17:19

相关推荐

03-31 21:47
东南大学 C++
彭于晏前来求offe...:吓晕了
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务