首先很容易想到,买的越多花钱越贵,同时,买的越多单个物品价格也就越高 用最少的钱买最多的物品,又满足单调性,显然就是一个裸的二分问题 check 其实就是一个简单的贪心问题,当确定现在要买 mid 件物品时,每个商品的价格也就 确定了 从小到大排序一下依次买即可,当然这里要注意,因为买的物品数量较多,可能会导致中间价 格溢出,要用 long long
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,k,a[100001],b[100001],ans;
bool f(int m)
{
for(int i = 1; i <= n; i++) b[i] = a[i] + m * i;
sort(b + 1,b + 1 + n);
int cnt = 0,tot = 0;
for(int i = 1; i <= n; i++)
{
if(tot + b[i] > k)
if(cnt >= m) return 1;
else return 0;
cnt++;
tot += b[i];
}
if(cnt >= m) return 1;
else return 0;
}
signed main()
{
cin>>n>>k;
for(int i = 1; i <= n; i++) cin>>a[i];
int l = 0,r = n,mid;
while(l <= r)
{
mid = (l + r) / 2;
if(f(mid))
{
l = mid + 1;
ans = mid;
}
else r = mid - 1;
}
cout<<ans;
return 0;
}