邓俊辉算法训练营 分组(暴力实现)

分组
描述
有n个正整数排成一排,你要将这些数分成m份(同一份中的数字都是连续的,不能隔开),同时数字之和最大的那一份的数字之和尽量小。

输入
输入的第一行包含两个正整数n,m。

接下来一行包含n个正整数。

输出
输出一个数,表示最优方案中,数字之和最大的那一份的数字之和。

样例1输入
5 2
2 1 2 2 3
样例1输出
5
样例1解释
若分成2和1、2、2、3,则最大的那一份是1+2+2+3=8;

若分成2、1和2、2、3,则最大的那一份是2+2+3=7;

若分成2、1、2和2、3,则最大的那一份是2+1+3或者是2+3,都是5;

若分成2、1、2、2和3,则最大的那一份是2+1+2+2=7。

所以最优方案是第三种,答案为5。

------------------暴力解法--------------------------------

#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
typedef long long ll;//定义long long 为 ll
ll getAnswer(vector<ll> q,ll n,ll m){
    //max 设为 最大的数字之和
    ll max = 0;//设一开始 max 为 0
    //因为最大数字之和 肯定大于等于 元素中最大的元素
    for(ll i = 0;i < n;i++){
        if(q[i] > max)max = q[i];
    }
    //sum 来计算分组
    ll sum;
    while(1){
        ll L = 0;//L来计算连续子段之和
        sum = 0;
        for(ll i = 0;i < n;i++){
             L += q[i];
             //如果L + 下一个元素超过了 max 则进行下一个子段的相加
            if(L + q[i + 1] > max){
                sum++;//子段数加1
                L = 0;
            }
            //如果子段数大于m则退出for循环
            if(sum > m)break;
        }
        //如果 max 满足条件 退出while循环 并返回 max的值
        if(sum <= m)break;
        //将max的值增加
        max++;
    }
    return max;
}
int main(int argc, char const *argv[]) {
    //n 代表元素数 m代表 分组数
    ll n,m;
    scanf("%lld%lld",&n,&m);
    vector<ll> q;
    for(ll i = 0;i < n;i++){
        ll a;
        scanf("%lld",&a);
        q.push_back(a);
    }
    printf("%lld",getAnswer(q,n,m));
    return 0;
}

猜你喜欢

转载自blog.csdn.net/WX_1218639030/article/details/83097942