序列

 

 这道题目是二分每一段的最大值的最小值(类似于贪)。主要在于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 }

 

posted @ 2022-05-08 10:52  王浩泽  阅读(56)  评论(0)    收藏  举报