voidsolve() { int n,k; cin >> n >> k; if(k == 0) { cout << 0 << "\n"; return; }
if(n>=k){ cout << 1 << "\n"; return; } int ans = 1; k-=n; for (int i = n-1; i >= 1; --i) { k -= i; ans++; if (k <= 0) break; k -= i; ans++; if (k <= 0) break; } cout << ans << "\n"; }
B1
题意
一个女孩正在为她的生日做准备,她想买一束最漂亮的花束。店里一共有 n 朵花,每朵花的特点是花瓣的数量,一朵有 k 花瓣的花要花 k 枚硬币。女孩已经决定,她将在她的花束中使用的任何两朵花之间的花瓣数量之差不应超过一。与此同时,女孩希望用最大可能的花瓣数组装花束。不幸的是,她只有 m 硬币,她不能花更多。她最多能在花束中收集多少花瓣?
int n, m; cin >> n >> m; vector<int> a(n); // vector<int> b(n); for (int i = 0; i < n; ++i) { cin >> a[i]; } sort(a.begin(), a.end()); // for (int i = 1; i < n; ++i) // { // b[i] = a[i] - a[i - 1]; // } int ans = 0; int lastz= n - 1; int temp = 0; for (int i = n - 1; i >= 0; --i) { if (a[i] > m) { continue; } temp+=a[i]; while (temp > m || (a[lastz] - a[i] > 1)) { temp -= a[lastz]; lastz--; } if(temp<=m) ans = max(temp, ans); } cout << ans << "\n"; } // 1 1 1 2 4 5 6 7
问题
TLE因为重复计算太多了。
B2
题意
这是问题的困难版本。唯一不同的是,在这个版本中,不是列出每种花的花瓣数量,而是为所有类型的花设置了花瓣数量和商店中的花朵数量。 一个女孩正在为她的生日做准备,她想买一束最漂亮的花束。店里总共有 n 种不同类型的花,每种花的特点是花瓣的数量和这种花的数量。一朵有 k 瓣的花要花 k 枚硬币。女孩已经决定,在任何两个花之间的花瓣数量的差异,她将用来装饰她的蛋糕不应该超过一个。与此同时,女孩希望用最大可能的花瓣数组装花束。不幸的是,她只有 m 硬币,她不能花更多。她最多能在花束中收集多少花瓣?
#include<bits/stdc++.h> usingnamespace std; #define int long long #define PII pair<int, int>
voidsolve() {
int n, m; cin >> n >> m; vector<int> a(n); map<int, int> f;
// vector<int> b(n); for (int i = 0; i < n; ++i) { cin >> a[i]; } for (int i = 0; i < n; ++i) { int c; cin >> c; f[a[i]] = c; } int ans = 0; for (auto [x, y] : f) { ans = max(ans, x * min<int>(y, m / x)); if (f.contains(x + 1)) { int z = f[x + 1]; // x+1的花数量 int c; if (x * y >= m) { c = m / x; // X的量超过了,x只能取c个 } else { c = y + min<int>(z, (m - x * y) / (x + 1)); // x的量减去了之后剩的给x+1 } ans = max(ans, min(m, c * x + min<int>(z, c))); } }
std::cout << ans << "\n"; }
// 1 1 1 2 4 5 6 7
signedmain() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int T; cin >> T; while (T--) solve();