C. Sagheer and Nubian Market
https://codeforces.com/problemset/problem/812/C
题意:给定n个物品,现在要购买这n个物品,购买时每个物品的代价是a[i] + i * k,其中k是实际购买的数量。给定初始金钱s,问s最多能购买多少个物品,相同的物品数量考虑最小的代价。
思路:在值域上二分,每次二分将所有物品根据当前的数量值对代价进行变更并排序,然后贪心的一次扫描,看能否满足当前值即可。
总结:真的好好读题了,但是为什么,理解出来的题意就是要购买连续的k个商品呢。。。
inline void solve() {
int n, s;
cin >> n >> s;
vector<long long> a(n);
for (auto& x : a) {
cin >> x;
}
long long cost = INF_LL;
int ans = 0;
auto valid = [&](int x) {
auto b = a;
for (int i = 0; i < n; ++i) {
b[i] += 1ll * (i + 1) * x;
}
sort(b.begin(), b.end());
long long sum = 0;
int cnt = 0;
for (int i = 0; i < x; ++i) {
if (sum + b[i] > s) {
return false;
}
sum += b[i];
cnt ++;
}
if (checkMax(ans, cnt)) {
cost = sum;
}
return true;
};
int l = 0, r = n;
while (l < r) {
int mid = (l + r + 1) >> 1;
if (valid(mid)) {
l = mid;
}
else {
r = mid - 1;
}
}
if (cost == INF_LL) {
cost = 0;
}
cout << ans << ' ' << cost << '\n';
}