poj 3273 二分答案

推薦一波個人博客:https://blog.nuoyanli.com/2020/01/30/poj-3273/

原題鏈接

http://poj.org/problem?id=3273

題意

給你nnmm的值,nn代表nn天,讓你將這nn天恰好分成mm段連續和,讓這mm段和裏面的最大值最小。

思路

因爲這個和具有單調性,二分答案,即二分最大連續和,下界取nn天的最大值,上界取nn天的和,從而找到最優值。

參考代碼

#include <algorithm>
#include <cmath>
#include <cstdio>

using namespace std;
int n, m, a[100005];
bool check(int mid) {
  int sum = 0, num = 1; //查詢每組上限爲mid的情況下的組數
  for (int i = 1; i <= n; i++) {
    if (sum + a[i] <= mid) {
      sum += a[i];
    } else {
      sum = a[i];
      num++;
    }
  }
  return num > m; //組數偏大,說明mid偏小
}
int main() {
  scanf("%d%d", &n, &m);
  int maxn = -1, sum = 0;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
    maxn = max(maxn, a[i]);
    sum += a[i];
  }
  int l = maxn, r = sum;
  int mid = (l + r) / 2;
  while (l < r) {
    if (check(mid)) {
      l = mid + 1;
    } else {
      r = mid - 1;
    }
    mid = (l + r) / 2;
  }
  printf("%d\n", mid);
  return 0;
}
發佈了305 篇原創文章 · 獲贊 222 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章