Problem p02598 (C++) — buggy submission, verdict: Time Limit Exceeded

#define LOCAL
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define rrep(i, n) for (int i = (n - 1); i >= 0; --i)
#define rep2(i, s, n) for (int i = s; i < (n); ++i)
#define ALL(v) (v).begin(), (v).end()
#define memr(dp, val) memset(dp, val, sizeof(dp))
using namespace std;
typedef long long ll;
static const int INTINF = (INT_MAX >> 1); // 10^9 + 10^7
static const ll LLINF = (LLONG_MAX >> 1);
static const int MAX = 100001;
static const ll MOD = 1000000007;
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> inline bool int_ceil(T a, T b) {
  T res = a / b;
  if (a % b != 0)
    res++;
  return res;
}
template <typename T>
using min_priority_queue = priority_queue<T, vector<T>, greater<T>>;
string to_string(string s) { return '"' + s + '"'; }
string to_string(bool b) { return b ? "true" : "false"; }
template <size_t N> string to_string(bitset<N> bs) {
  string res;
  for (size_t i = 0; i < N; ++i)
    res += '0' + bs[i];
  return res;
}
string to_string(vector<bool> v) {
  string res = "{";
  for (bool e : v)
    res += to_string(e) + ", ";
  return res += "}";
}
template <class T, class U> string to_string(pair<T, U> p);
template <class C> string to_string(C c) {
  string res = "{";
  for (auto e : c)
    res += to_string(e) + ", ";
  return res += "}";
}
template <class T, class U> string to_string(pair<T, U> p) {
  return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
}
void debug() { cerr << '\\n'; }
template <class Head, class... Tail> void debug(Head head, Tail... tail) {
  cerr << '\\t' << to_string(head), debug(tail...);
}
#ifdef LOCAL
#define print(...) cerr << "[" << #__VA_ARGS__ << "]:", debug(__VA_ARGS__)
#else
#define print(...)
#endif

ll n, k;
vector<ll> v;
ll ans = 0;
bool rec(double mid) {
  ll res = 0;
  rep(i, n) {
    ll tmp = (double)v[i] / (double)mid;
    if (tmp < (double)v[i] / (double)mid)
      tmp++;
    res += tmp - 1;
  }
  // print(res);
  if (res <= k)
    return true;
  else
    return false;
}

int main(int argc, const char *argv[]) {
  std::cout << std::fixed << std::setprecision(15);

  cin >> n >> k;
  v.resize(n);
  rep(i, n) cin >> v[i];
  sort(ALL(v), greater<ll>());
  if (k <= 0) {
    cout << v[0] << endl;
    return 0;
  }

  ll l = 1, r = 1e9 + 1;
  rep(_, 100) {
    ll mid = (r + l) / 2;
    if (rec(mid)) {
      r = mid;
    } else {
      l = mid;
    }
  }

  cout << (ll)r << endl;
  return 0;
}


Error: TLE

Fixed submission:

#define LOCAL
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define rrep(i, n) for (int i = (n - 1); i >= 0; --i)
#define rep2(i, s, n) for (int i = s; i < (n); ++i)
#define ALL(v) (v).begin(), (v).end()
#define memr(dp, val) memset(dp, val, sizeof(dp))
using namespace std;
typedef long long ll;
static const int INTINF = (INT_MAX >> 1); // 10^9 + 10^7
static const ll LLINF = (LLONG_MAX >> 1);
static const int MAX = 100001;
static const ll MOD = 1000000007;
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> inline bool int_ceil(T a, T b) {
  T res = a / b;
  if (a % b != 0)
    res++;
  return res;
}
template <typename T>
using min_priority_queue = priority_queue<T, vector<T>, greater<T>>;
string to_string(string s) { return '"' + s + '"'; }
string to_string(bool b) { return b ? "true" : "false"; }
template <size_t N> string to_string(bitset<N> bs) {
  string res;
  for (size_t i = 0; i < N; ++i)
    res += '0' + bs[i];
  return res;
}
string to_string(vector<bool> v) {
  string res = "{";
  for (bool e : v)
    res += to_string(e) + ", ";
  return res += "}";
}
template <class T, class U> string to_string(pair<T, U> p);
template <class C> string to_string(C c) {
  string res = "{";
  for (auto e : c)
    res += to_string(e) + ", ";
  return res += "}";
}
template <class T, class U> string to_string(pair<T, U> p) {
  return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
}
void debug() { cerr << '\\n'; }
template <class Head, class... Tail> void debug(Head head, Tail... tail) {
  cerr << '\\t' << to_string(head), debug(tail...);
}
#ifdef LOCAL
#define print(...) cerr << "[" << #__VA_ARGS__ << "]:", debug(__VA_ARGS__)
#else
#define print(...)
#endif

int main(int argc, const char *argv[]) {
  std::cout << std::fixed << std::setprecision(15);

  int n, k;
  cin >> n >> k;
  priority_queue<tuple<double, ll, ll>> q;
  vector<ll> v(n);
  rep(i, n) cin >> v[i];
  rep(i, n) { q.push({v[i], v[i], 1}); }

  rep(i, k) {
    auto x = q.top();
    q.pop();
    get<2>(x)++;
    get<0>(x) = (double)get<1>(x) / (double)get<2>(x);
    // print(get<0>(x), get<1>(x), get<2>(x));
    q.push(x);
    // print(get<0>(q.top()));
  }

  ll ans = get<0>(q.top());
  if (get<0>(q.top()) > ans)
    ans++;
  cout << ans << endl;

  return 0;
}