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

浙公网安备 33010602011771号