题目大意
找到合适的x来最小化
∑ni=1⌊aix⌋+ai%x
解法
把模给拆了
∑ni=1ai+∑ni=1⌊aix⌋∗(1−x)
维护桶的前缀和,枚举x和
⌊aix⌋
计算答案即可
#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const int maxn=1000000+10;
int a[maxn],sum[maxn];
int i,j,k,l,r,t,n,m;
ll ans,now;
int read(){
int x=0,f=1;
char ch=getchar();
while (ch<'0'||ch>'9'){
if (ch=='-') f=-1;
ch=getchar();
}
while (ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
int main(){
n=read();
fo(i,1,n){
t=read();
a[t]++;
}
fo(i,1,maxn-10) sum[i]=sum[i-1]+a[i];
ans=1000000000000000;
fo(i,1,maxn-10){
now=0;
fo(j,1,(maxn-10)/i){
l=i*j;r=min(i*(j+1)-1,maxn-10);
now+=(ll)j*(1-i)*(sum[r]-sum[l-1]);
}
ans=min(ans,now);
}
fo(i,1,maxn-10) ans+=(ll)a[i]*i;
printf("%lld\n",ans);
}