数列分段Section II(二分)

洛谷传送门

输入时处理出最小的答案和最大的答案,然后二分答案即可。

其余细节看代码

 1 #include <iostream>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 
 6 int n, m, a[100001], x, y, ans = 100001;
 7 
 8 bool pd(int mid)
 9 {
10     int i, sum = 0, tot = 1;
11     for(i = 1; i <= n; i++)
12     {
13         sum += a[i];
14         if(sum > mid)//分段数+1 
15         {
16             sum = a[i];
17             tot++;
18         }
19     }
20     if(tot > m) return 0;
21     return 1;//如果是小于m的话也还可以再分 
22 }
23 
24 int main()
25 {
26     int i, j, mid;
27     scanf("%d %d", &n, &m);
28     for(i = 1; i <= n; i++)
29     {
30         scanf("%d", &a[i]);
31         x = max(x, a[i]);//答案最小 
32         y += a[i];//答案最大 
33     }
34     while(x <= y)
35     {
36         mid = (x + y) >> 1;
37         if(pd(mid)) y = mid - 1;
38         else x = mid + 1;
39     }
40     printf("%d", x);
41     return 0;
42 }
View Code
原文地址:https://www.cnblogs.com/zhenghaotian/p/6719530.html