题意:
n个商品,有s块钱,买第i件商品的价格为a[i]+i*k,a[i]为商品的基础价格,k为总共要买的商品数量,问最多能买多少件商品,在买相同数量的商品情况下,尽量让花的钱最少。
解题思路:
二分枚举要买的商品数量,然后排序一下价格,check是否能买到当前答案数量的商品,求出一个最大值即可。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
long long a[maxn];
long long b[maxn];
int main()
{
int n, s, i;
long long j;
cin>>n>>s;
for(i=1; i<=n; i++)
{
scanf("%lld", &a[i]);
}
long long l=0, r=n, mid;
long long m, ans=0, sum=0;
for(i=0; i<50; i++)//枚举次数视题目而定
{
// cout<<l<<" "<<r<<endl;
mid=(l+r)>>1;
m=0;
for(j=1; j<=n; j++)
{
b[j]=a[j]+j*mid;
}
sort(b+1, b+n+1);
for(j=1; j<=mid; j++)
{
m+=b[j];
if(m>s)break;
}
if(j<=mid)
{
r=mid-1;
}
else
{
ans=mid;
sum=m;
l=mid+1;
}
}
printf("%lld %lld\n", ans, sum);
return 0;
}