4 条题解

  • 2
    @ 2025-11-2 23:32:07

    为了能购买最大数量的大红,我们肯定要多买价钱低的大红,那我们就去求数组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
    上传者