分组
描述
有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;
}