제출 #764648

#제출 시각아이디문제언어결과실행 시간메모리
764648ind1v구경하기 (JOI13_watching)C++11
50 / 100
1073 ms16216 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 2005;

int n, p, q;
long long a[N];
int dp[N][N];

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> p >> q;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
  }
  if (p + q >= n) {
    cout << 1;
    exit(0);
  }
  sort(a + 1, a + n + 1);
  a[0] = numeric_limits<long long>::min();
  int l = 1, r = 1000000000, ans = -1;
  while (l <= r) {
    int m = l + r >> 1;
    memset(dp, 0x3f, sizeof(dp));
    for (int j = 0; j <= q; j++) {
      dp[0][j] = 0;
    }
    for (int i = 1; i <= n; i++) {
      for (int j = 0; j <= q; j++) {
        int prv = upper_bound(a, a + n + 1, a[i] - m) - a;
        dp[i][j] = min(dp[i][j], 1 + dp[prv - 1][j]);
        if (j > 0) {
          prv = upper_bound(a, a + n + 1, a[i] - 2 * m) - a;
          dp[i][j] = min(dp[i][j], dp[prv - 1][j - 1]);
        }
      }
    }
    if (dp[n][q] <= p) {
      ans = m;
      r = m - 1;
    } else {
      l = m + 1;
    }
  }
  cout << ans;
  return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

watching.cpp: In function 'int main()':
watching.cpp:26:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   26 |     int m = l + r >> 1;
      |             ~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...