思路:二分答案 。check():检查组p套卡是否成立,即检查r卡是否足够组成p套卡。
(易错点:check的思路,开long long)
#include <bits/stdc++.h> using namespace std; long long int n, m; long long int c[60]; bool check(long long int p) // p套卡 { long long int temp = 0; // 组p套卡需要多少张r卡 for (long long int i = 1; i <= n; i++) { if (p > c[i]) { temp += p - c[i]; } } if (temp <= m && temp <= p) // 一组最多有1张r卡 { return true; } return false; } int main() { cin >> n >> m; long long int maxn = 0; for (long long int i = 1; i <= n; i++) { cin >> c[i]; maxn = max(maxn, c[i]); } long long int ans = 0; // 二分答案 long long int l = 0, r = maxn + m; while (l <= r) { long long int mid = l + (r - l) / 2; if (check(mid)) { l = mid + 1; ans = mid; } else { r = mid - 1; } } cout << ans; }