洛谷P1182数列分段】的更多相关文章

洛谷 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段和为…
题目描述 对于给定的一个长度为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段.将每段中的数相加,问之和的最大值的最小值是多少. 思路: 和P1316丢瓶盖很像,就是反一下而已. 同样是二分答案,然后检查一下当前的答案可不可行,如果可行由于需要得到最小值,所以缩小上界. 要注意的点是,st的初始化应该是num中的最大值而不是随意给一个0 这会影响到分段的计数. 如果当前值是比某一个num要小的话,cnt还是+1了. #include<stdio.…
题目描述 对于给定的一个长度为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. 输…
这是一道典型的二分答案问题(最大值最小,最小值最大)关键是对于细节的处理. 二分的框架: //l=max{num[i]},r=sum{num[i]} while(l<=r){ int m=(l+r)>>1; if(chk(m)){ r=m-1; }else l=m+1; } cout<<l; 二分的框架是普遍使用的,关键是检验函数的设计,此处的检验函数的含义为: 是否存在一种合法的划分,使得每段的最大值都不大于m. 设计好了检验函数,就要思考l与r的转移:若存在这种合法的划分…
[代码]: #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&…
题面 给大家普及一个知识,只要看到最大值最小或最小值最大等字样就往二分上想吧! 然后是正解部分:   我们可以二分答案:   对于每次二分的区间取中间值mid,并对其进行check()判断:   如果所有段的最大值为mid时可以分成m段(注意,如果此时分成的段比m还小,那么也是可行的,因为你可以随便拆拆就能拆成m段,但显然可能不是最优的解),那么我们就将二分区间更改为(l,mid),因为(mid+1,r)区间所有的答案均可行且都不是最优的.否则将区间改为(mid+1,r);    另外说明一下,…
题目描述 对于给定的一个长度为NN的正整数数列A_iAi​,现要将其分成连续的若干段,并且每段和不超过MM(可以等于MM),问最少能将其分成多少段使得满足要求. 输入输出格式 输入格式: 第1行包含两个正整数N,MN,M,表示了数列A_iAi​的长度与每段和的最大值,第22行包含NN个空格隔开的非负整数A_iAi​,如题目所述. 输出格式: 一个正整数,输出最少划分的段数. 输入输出样例 输入样例#1: 复制 5 6 4 2 4 5 1 输出样例#1: 复制 3 说明 对于20\%20%的数据,…
题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成连续的若干段,并且每段和不超过M(可以等于M),问最少能将其分成多少段使得满足要求. 输入输出格式 输入格式: 输入文件divide_a.in的第1行包含两个正整数N,M,表示了数列A[i]的长度与每段和的最大值,第2行包含N个空格隔开的非负整数A[i],如题目所述. 输出格式: 输出文件divide_a.out仅包含一个正整数,输出最少划分的段数. 输入输出样例 输入样例#1: 复制 5 6 4 2 4 5 1 输出样例#1: …
题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成连续的若干段,并且每段和不超过M(可以等于M),问最少能将其分成多少段使得满足要求. 输入输出格式 输入格式: 输入文件divide_a.in的第1行包含两个正整数N,M,表示了数列A[i]的长度与每段和的最大值,第2行包含N个空格隔开的非负整数A[i],如题目所述. 输出格式: 输出文件divide_a.out仅包含一个正整数,输出最少划分的段数. 输入输出样例 贪心 屠龙宝刀点击就送 #include <cstdio> vo…