题目大意:有n种扑克牌,每种有ci个。还有m张百搭牌。一个套牌是1,2,...,n或者用百搭牌代替其中任一张。最多可以造出几个套牌。

https://ac.nowcoder.com/acm/problem/19916

也许有纯数学的做法,但是能造出k个套牌显然也能造出k-1个套牌,所以feasibility符合单调性。可以使用binary search寻找最大的k,使得可以造出k个套牌。

对于k个套牌,第i中套牌必须使用max(0, k-ci)个百搭牌,而且每个百搭牌只能在一套里出现,所以总和不超过min(m, k)。

bool feas(ll cnt, VL& c, ll m) {
  // Checks if it's possible to get cnt decks.
  VL each;
  FORE(x, c) {
    each.PB(max(0LL, cnt - x));
  }
  ll sm = SUM(each);
  return sm <= m && sm <= cnt;
}

int main(int argc, char* argv[]) {
  /* Do not use for codejam. */
  /* ios_base::sync_with_stdio(false); cin.tie(NULL); */
  readint(n);readlong(m);
  readvl(c, n);
  ll lo = 0, hi = 20000000000LL;
  while (lo < hi) {
    ll mi = RMID(lo, hi);
    if (feas(mi, c, m)) {
      lo = mi;
    } else {
      hi = mi - 1;
    }
  }
  printlong(lo);
  return 0;
}