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;
}

本文介绍了一种使用二分加贪心策略的算法,解决在有限预算下购买最大数量物品的问题。通过预计算物品价值并进行排序,算法能够高效地确定可购买的最大物品数量及总花费。
356

被折叠的 条评论
为什么被折叠?



