缩进优化

  QAQ我当时一直在想:$min\{ \sum_{i=1}^n (\lfloor\frac{a[i]}{x}\rfloor + a[i] \ mod\ x) \}$

  然而并不会做啊……一点思路也没有……主要是后面那个取模非常难受……

  其实正解有点逆向思维的感觉:$ans=\sum_{i=1}^n a[i] - max\{ \sum_{i=1}^n \lfloor \frac{a[i]}{x}\rfloor *(x-1) \} $

  也就是先将a[i]全部加起来,然后再使得被缩掉的部分最大。

  然后……枚举x,枚举x的倍数,数一下除以x为 i 的有多少个就可以了……$O(nlogn)$

 1 //UOJ Round #1 A
 2 #include<vector>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cstdlib>
 6 #include<iostream>
 7 #include<algorithm>
 8 #define rep(i,n) for(int i=0;i<n;++i)
 9 #define F(i,j,n) for(int i=j;i<=n;++i)
10 #define D(i,j,n) for(int i=j;i>=n;--i)
11 #define pb push_back
12 using namespace std;
13 inline int getint(){
14     int v=0,sign=1; char ch=getchar();
15     while(ch<'0'||ch>'9'){ if (ch=='-') sign=-1; ch=getchar();}
16     while(ch>='0'&&ch<='9'){ v=v*10+ch-'0'; ch=getchar();}
17     return v*sign;
18 }
19 const int N=1e6+10,INF=~0u>>2;
20 typedef long long LL;
21 /******************tamplate*********************/
22 
23 int a[N],c[N],n;
24 int main(){
25 #ifndef ONLINE_JUDGE
26     freopen("A.in","r",stdin);
27     freopen("A.out","w",stdout);
28 #endif
29     n=getint();
30     LL sum=0,ans=0;
31     int mx=0;
32     F(i,1,n) a[i]=getint(),c[a[i]]++,sum+=a[i],mx=max(mx,a[i]);
33     D(i,mx,1) c[i]+=c[i+1];
34     
35     F(x,1,mx){
36         LL tmp=0; int i;
37         for(i=1;(i+1)*x<=mx;i++)
38             tmp+=(c[i*x]-c[(i+1)*x])*i;
39         tmp+=c[i*x]*i;
40         ans=max(ans,tmp*(x-1));
41     }
42     printf("%lld\n",sum-ans);
43     return 0;
44 }
View Code

相关文章: