题意:
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;
}
本文介绍了一种通过二分枚举结合排序策略解决特定购物问题的算法。该问题旨在确定在预算限制下能够购买的最大商品数量,并确保花费尽可能少。算法通过多次迭代找到最佳购买方案。
395

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



