4 条题解
-
2
为了能购买最大数量的大红,我们肯定要多买价钱低的大红,那我们就去求数组c的最小后缀,也就是说,求从c[n]到c[i]的最小值,假设我们用数组b去存数组c的最小后缀,那b[i]的值就代表从c[n]到c[i]的最小值,之后我们在按照题意去遍历c数组,当b[i]==c[i]时,就是我们的最佳购买时机。那为什么不从c[1]往c[i]去遍历呢?原因就在于后面可能会有比前面更低的价格,在加上如果我们在前几轮不买大红,那我们的钱就会越来越多,所以从c[n]到c[i]才是最佳方案。
#include<bits/stdc++.h>
using namespace std;
long long a[200100],b[200100];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
b[n+1]=1e18;
for(int i=n;i>=1;i--){
b[i]=min(b[i+1],a[i]);
}
long long ans=0,cost=0;
for(int i=1;i<=n;i++){
if(a[i]==b[i]){
long long z=(i-cost)/a[i];
if(z>0){
ans+=z;
cost=cost+z*a[i];
}
}
}
printf("%lld",ans);
return 0;
}
信息
- ID
- 1179
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 203
- 已通过
- 40
- 上传者