n个拥有基础值的物品,有s块钱,问最多能买多少个物品。
物品的价值=基础值+编号(1~n)*cnt(买的个数)。
二分思想,从能买一半开始贪心买最便宜的mid个,详见代码。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e5+5;
ll a[N],tmp[N];
int main(){
ll n,s;
while(~scanf("%lld %lld",&n,&s)){
for(int i=0;i<n;i++)
scanf("%lld",&a[i]);
ll sum=0,cnt=0,ans=0;
ll l=0,r=n,mid;
while(l<=r){
mid=(l+r)/2;
for(int i=0;i<n;i++)
tmp[i]=a[i]+(i+1)*mid;
sum=0;
sort(tmp,tmp+n);
for(int i=0;i<mid;i++)
sum+=tmp[i];
if(sum>s)
r=mid-1;
else{
cnt=mid;
l=mid+1;
ans=sum;
}
}
printf("%lld %lld\n",cnt,ans);
}
return 0;
}