Libre OJ 10005 数列分段 II数列极差(二分结果,倒推过程)

mac2022-06-30  22

题目链接:https://loj.ac/problem/10014 分析:对于结果,两种极限情况 第一种,N个数,分了N组,此时的结果为N个数的最大值 第二种,N个数分了1组,最大值为N个数的和。

从这两种极值出发,进行二分。对应每一个值的分组情况,从而确定区间 代码:

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int INF=0x3f3f3f3f; int mi; int N,M,a[100004]; int solve(int x) { int sum=0,ans=1; for(int i=0; i<N; i++) { sum+=a[i]; if(sum>x) { ans++;/*ans为分组的数量*/ sum=a[i]; } } if(ans>M)/*说明分小了*/ return 0; else return 1; } int main() { scanf("%d%d",&N,&M); int l=0,r=0; for(int i=0; i<N; i++) { scanf("%d",&a[i]); l=max(l,a[i]);/*两种极值情况*/ r+=a[i]; } while(l<r) { int mid=(l+r)>>1;/*对于每一种结果看能分几组*/ if(solve(mid)) r=mid; else l=mid+1; } printf("%d\n",r); return 0; }
最新回复(0)