序列
这道题目是二分每一段的最大值的最小值(类似于贪)。主要在于check函数。
(check)思路: 输入一个每一段的最小值 然后看能不能实现。

接下来主程序可以套模板啦!
程序:
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e6+10,N2=2e9; 4 int n,m,a[N]={0}; 5 int check(int k) 6 { 7 int ans=0,num=0; 8 for(int i=1;i<=n;i++) 9 { 10 if(a[i]>k) 11 { 12 return 0; 13 } 14 if(a[i]+num<=k) 15 { 16 num+=a[i]; 17 } 18 else 19 { 20 num=a[i]; 21 ans++; 22 } 23 } 24 ans++; 25 if(ans<=m) return 1; 26 else return 0; 27 } 28 int main() 29 { 30 scanf("%d%d",&n,&m); 31 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 32 int r=N2,l=0; 33 while(l+1!=r) 34 { 35 int mid=(l+r)/2; 36 if(check(mid)==1) r=mid; 37 else l=mid; 38 } 39 printf("%d",r); 40 return 0; 41 }

浙公网安备 33010602011771号