#include<iostream> #include<vector> #include<algorithm> using namespace std; int M, N; int main(){ cin >> M >> N; vector<int> temp; ; i < M; i++){ int n; cin >> n; ){ ] + n <= N){ temp[temp.size() - ] += n;…
传送门 思路: 求数列每段和的最大值的最小值,很明显是用二分法求解,加贪心检验.本题关键是要怎么去高效的check,可以考虑一个贪心的思路,能加的就加上,不能则新开一段,so对于二分的值 u ,我们从数列 sum 从前往后扫,如果 tot 大于了 u ,我们不加而是 tot 重新赋值并且 cnt++ ,最后只需判断 cnt 是否不小于 m 就行了.这样判断与前缀和一样是O(n)的复杂度,但是节省了空间且容易思考. 标程: #include<iostream> #include<algor…
[代码]: #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&…
[题解] 最大值最小化,那么一般要联想到二分.二分一个最大值,然后check一下能否分成小于等于m段即可. #include<cstdio> #include<algorithm> #include<cstring> #define LL long long #define rg register #define N 200010 using namespace std; int n,m,l,r,mid,a[N]; inline int read(){ ,f=; cha…