提供零基础网站建设教学,百度小程序如何开发,北京公司注册查询,网页设计计划书怎么写文章目录 题目描述输入格式输出格式样例样例输入样例输出 数据范围与提示完整代码 题目描述
对于给定的一个长度为N的正整数数列 A 1 ∼ N A_{1\sim N} A1∼N#xff0c;现要将其分成 M M M#xff08; M ≤ N M\leq N M≤N#xff09;段#xff0c;并要求每段连续现要将其分成 M M M M ≤ N M\leq N M≤N段并要求每段连续且每段和的最大值最小。
关于最大值最小
例如一数列 4 2 4 5 1 4\ 2\ 4\ 5\ 1 4 2 4 5 1 要分成 3 3 3 段。
将其如下分段 [ 4 2 ] [ 4 5 ] [ 1 ] [4\ 2][4\ 5][1] [4 2][4 5][1]
第一段和为 6 6 6第 2 2 2 段和为 9 9 9第 3 3 3 段和为 1 1 1和最大值为 9 9 9。
将其如下分段 [ 4 ] [ 2 4 ] [ 5 1 ] [4][2\ 4][5\ 1] [4][2 4][5 1]
第一段和为 4 4 4第 2 2 2 段和为 6 6 6第 3 3 3 段和为 6 6 6和最大值为 6 6 6。
并且无论如何分段最大值不会小于 6 6 6。
所以可以得到要将数列 4 2 4 5 1 4\ 2\ 4\ 5\ 1 4 2 4 5 1 要分成 3 3 3 段每段和的最大值最小为 6 6 6。
输入格式
第 1 1 1 行包含两个正整数 N , M N,M N,M。
第 2 2 2 行包含 N N N 个空格隔开的非负整数 A i A_i Ai含义如题目所述。
输出格式
一个正整数即每段和最大值最小为多少。
样例
样例输入
5 3
4 2 4 5 1样例输出
6数据范围与提示
对于 20 % 20\% 20% 的数据 N ≤ 10 N\leq 10 N≤10。
对于 40 % 40\% 40% 的数据 N ≤ 1000 N\leq 1000 N≤1000。
对于 100 % 100\% 100% 的数据 1 ≤ N ≤ 1 0 5 1\leq N\leq 10^5 1≤N≤105 M ≤ N M\leq N M≤N A i 1 0 8 A_i 10^8 Ai108 答案不超过 1 0 9 10^9 109。
题目传送门
完整代码
#include bits/stdc.h
using namespace std;
int n, m, cnt, a[100001];
bool check(int mid) {int num 1, k 0;for (int i 1; i n; i) {if (a[i] mid)return false;if (a[i] k mid)num, k a[i];elsek a[i];if (num m)return false;}return true;
}
int ans(int a, int b) {int l a, h b, m;while (l h) {m (l h) 1;if (check(m))h m - 1, cnt m;elsel m 1;}return cnt;
}
int main() {int maxx 0, sum 0;scanf(%d%d, n, m);for (int i 1; i n; i) {scanf(%d, a[i]);sum a[i], maxx max(maxx, a[i]);}printf(%d, ans(maxx, sum));return 0;
}