F.cpp 858 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main() {
  4. ifstream cin("data2.in");
  5. int n;
  6. cin >> n;
  7. vector<int> v(n);
  8. int Max = 0, Sum = 0;
  9. for (int i = 0; i < n; i++) {
  10. cin >> v[i];
  11. Sum += v[i];
  12. Max = max(Max, v[i]);
  13. }
  14. int m;
  15. cin >> m;
  16. int left = Max, right = Sum, best = Sum;
  17. while (left <= right) {
  18. int Mid = (left + right) >> 1;
  19. int cur = 0, tot = 0;
  20. for (int i = 0; i < n; i++) {
  21. if (cur + v[i] > Mid) {
  22. tot++;
  23. cur = v[i];
  24. } else {
  25. cur += v[i];
  26. }
  27. }
  28. if(cur!=0)
  29. ++tot;
  30. if (tot <= m) {
  31. best = Mid;
  32. right = Mid - 1;
  33. } else {
  34. left = Mid + 1;
  35. }
  36. }
  37. cout << best << endl;
  38. return 0;
  39. }