D-Price Tags

题意:

给定n个商品价格,现在同时除以一个x(x>1)向上取整,如果有商品价格和原来相同,就可以省去y元,否则需要花费y元。每个商品可以贡献向上取整后价格的花费。求最优x时的最大答案

思路:

对于一个数i,可以被(x/(i-1),x/i]向上除x后得到
由于数组元素范围不大,可以考虑枚举x,然后再枚举值域[1,(mx+x-1)/x](其中mx是数组元素的最大值)

显然这是所有数组元素被x除后可能得到的数的值域,那么只需要知道原数组(x/(i-1),x/i]范围有多少个数,和i有多少个数就能求出答案

考虑使用桶+前缀和维护

这题卡map

时间复杂度应该是一个调和级数,也就是nlog级别的

void solve(){
    int n,y;cin>>n>>y;
    vector<int>a(n+1);
    int mx=0;
    rep(i,1,n)cin>>a[i],mx=max(mx,a[i]);
    vector<int>tot(mx+1);
    rep(i,1,n)tot[a[i]]++;
    vector<int>pre(mx+1);
    rep(i,1,mx){
        pre[i]+=pre[i-1]+tot[i];
    }
    int ans= -n*y;
    ans+=n;
    ans+=tot[1]*y;

    for(int x=2;(mx+x-1)/x>1;x++){
        int up = (mx+x-1)/x;
        int res=-n*y;
        for(int i=1;i<=up;i++){
            int nums = pre[min(mx,i*x)] - pre[x*(i-1)];
            int v = min(nums,tot[i]);
            res+=v*y;
            res+=i*nums;
        }
        ans=max(ans,res);
    }
    cout<<ans<<endl;
}
posted @ 2025-09-16 23:09  Marinaco  阅读(13)  评论(0)    收藏  举报
//雪花飘落效果