voidsolve() { int n; ll m; ll ans = 0; cin >> n >> m; map<int, int> mp; for (int i = 0; i < n; i++) { int x; cin >> x; mp[x]++; } for (auto &[x, y] : mp) //遍历map元素 { ans = max(ans, 1LL * x * min<ll>(y, m/x)); //能容纳的最大值 if(mp.find(x + 1) != mp.end()) { int z = mp[x + 1]; //取下一元素 for (int i = 1; i <= y && 1LL * i * x <= m; i++) { //尝试将此节点与下一节点组合 ans = std::max(ans, 1LL * i * x + 1LL * (x + 1) * std::min<ll>(z, (m - 1LL * i * x) / (x + 1))); } } } cout << ans << endl;
voidsolve() { int n; ll m; std::cin >> n >> m; std::map<int, int> f; std::vector<int> a(n); for (int i = 0; i < n; i++) { std::cin >> a[i]; } for (int i = 0; i < n; i++) { int c; std::cin >> c; f[a[i]] = c; } ll ans = 0; for (auto [x, y] : f) { // 计算仅用花瓣数为 x 的花时的最大花瓣数 ans = std::max(ans, 1LL * x * std::min<ll>(y, m / x)); if (f.find(x + 1) != f.end()) { //元素按照升序遍历。 int z = f[x + 1]; ll c; // 如果花瓣数为 x 的花可以完全使用预算 if (1LL * x * y >= m) { c = m / x; //可以拿的第y种花的最大数 } else { // 计算最多能用多少花瓣数为 x + 1 的花 c = y + std::min<ll>(z, (m - 1LL * x * y) / (x + 1)); } ans = std::max(ans, std::min(m, c * x + std::min<ll>(c, z))); } } std::cout << ans << "\n"; }