[代码]: #include<bits/stdc++.h> const double eps = 1e-8; const int maxn = 1e6+5; #define inf 0x3f3f3f3f #define ll long long using namespace std; int n,m; int a[maxn]; int check(int x) { int sum = 0, cnt = 1;//r是划分的段数,所以要从1开始(相当于植树问题啦) for(int i=1; i&…
P1182 数列分段Section II 题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 1要分成3段 将其如下分段: [4 2][4 5][1] 第一段和为6,第2段和为9,第3段和为1,和最大值为9. 将其如下分段: [4][2 4][5 1] 第一段和为4,第2段和为6,第3段和为6,和最大值为6. 并且无论如何分段,最大值不会小于6. 所以可以得到要将数列4 2 4 5…
洛谷 P1182 数列分段 Section II 洛谷传送门 题目描述 对于给定的一个长度为N的正整数数列A-iA−i,现要将其分成M(M≤N)M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 142451要分成33段 将其如下分段: [4 2][4 5][1][42][45][1] 第一段和为66,第22段和为99,第33段和为11,和最大值为99. 将其如下分段: [4][2 4][5 1][4][24][51] 第一段和为44,第22段和为…
这道题让我见识了二分的新姿势.本来,我是二分的位置的. 思路:直接二分答案x, 关键是检验函数的写法: 先用前缀和 a[i....], 看满足多少段满足 a[ j ]-a[ i ]<=x; 的注意这里利用了贪心(因为,要使最大值最小,那么每一段要尽量接近x),然后,如果这样的段数刚好等于m 段时,就判断正确了. 当然,在二分的时候也要向左边二分答案,毕竟是在求最小化. #include<iostream> #include<algorithm> using namespace…
题目描述 对于给定的一个长度为N的正整数数列A-iA−i,现要将其分成M(M≤N)M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 142451要分成33段 将其如下分段: [4 2][4 5][1][42][45][1] 第一段和为66,第22段和为99,第33段和为11,和最大值为99. 将其如下分段: [4][2 4][5 1][4][24][51] 第一段和为44,第22段和为66,第33段和为66,和最大值为66. 并且无论如何分段,最…
题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 1要分成3段 将其如下分段: [4 2][4 5][1] 第一段和为6,第2段和为9,第3段和为1,和最大值为9. 将其如下分段: [4][2 4][5 1] 第一段和为4,第2段和为6,第3段和为6,和最大值为6. 并且无论如何分段,最大值不会小于6. 所以可以得到要将数列4 2 4 5 1要分成3段,每段和的最大值最小为6. 输…
https://www.luogu.org/problemnew/show/P1182 做了这个题才知道二分的强大 这个题可以假设我们有n个果子 m个容器 要能把果子全装进去 那么容器最小可以是多小 很显然 如果我们的容器每一个都能把全部的果子装进去 那么一定是一种可行的解 但不是最优的 容器最小是多小呢?至少要能装得下最大的果子 所以答案就在 maxAi 和 sumAi 之间 进行二分查找即可 如果当前的mid是容器的容量,求出来需要多少容器 如果比 m 多 那么说明 mid 太小了 如果小于…
传送门 思路: 求数列每段和的最大值的最小值,很明显是用二分法求解,加贪心检验.本题关键是要怎么去高效的check,可以考虑一个贪心的思路,能加的就加上,不能则新开一段,so对于二分的值 u ,我们从数列 sum 从前往后扫,如果 tot 大于了 u ,我们不加而是 tot 重新赋值并且 cnt++ ,最后只需判断 cnt 是否不小于 m 就行了.这样判断与前缀和一样是O(n)的复杂度,但是节省了空间且容易思考. 标程: #include<iostream> #include<algor…
题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 1要分成3段 将其如下分段: [4 2][4 5][1] 第一段和为6,第2段和为9,第3段和为1,和最大值为9. 将其如下分段: [4][2 4][5 1] 第一段和为4,第2段和为6,第3段和为6,和最大值为6. 并且无论如何分段,最大值不会小于6. 所以可以得到要将数列4 2 4 5 1要分成3段,每段和的最大值最小为6. 输…
洛谷传送门 输入时处理出最小的答案和最大的答案,然后二分答案即可. 其余细节看代码 #include <iostream> #include <cstdio> using namespace std; ], x, y, ans = ; bool pd(int mid) { , tot = ; ; i <= n; i++) { sum += a[i]; if(sum > mid)//分段数+1 { sum = a[i]; tot++; } } ; ;//如果是小于m的话也…