Description

你有n种牌,第i种牌的数目为ci。另外有一种特殊的牌:joker,它的数目是m。你可以用每种牌各一张来组成一套牌,也可以用一张joker和除了某一种牌以外的其他牌各一张组成1套牌。比如,当n=3时,一共有4种合法的套牌:{1,2,3}, {J,2,3}, {1,J,3}, {1,2,J}。 给出n, m和ci,你的任务是组成尽量多的套牌。每张牌最多只能用在一副套牌里(可以有牌不使用)。

Solution

求最大的答案,首先考虑推公式,公式不好推,转而考虑二分答案然后去 。 我们二分一个答案,然后对于每一种牌去检验,如果当前的牌小于答案,那么就要用 去填充,最后注意我们二分的答案不能超过我们用的 数,否则就会出现一次用了两张 的情况,是不合法的。
PS: 我二分的上界一开始是 1e18, 把自己 哭了

Code

#pragma GCC optimize(3)
#include<bits/stdc++.h>

using namespace std;

const int mod = 100000000;
const int N = 5e5 + 5;
typedef long long ll;
const double pi = acos(-1.0);
int a[N];
int n, m;
bool check(int x) {
  ll cur = 0;
  for(int i = 1; i <= n; i++) {
    if(a[i] < x) {
      cur += x - a[i];
    }
  }
  return cur <= m && cur <= x;
}
int main() {
  ios::sync_with_stdio(false), cin.tie(nullptr);
  cin >> n >> m;
  for(int i = 1; i <= n; i++) cin >> a[i];
  int left = 0, right = 1e9, ans = 0;
  while(left <= right) {
    int mid = left + right >> 1;
    if(check(mid)) {
      left = mid + 1;
      ans = mid;
    } else {
      right = mid - 1;
    }
  }
  cout << ans << "\n";
  return 0; 
}