1 solutions
-
0
以下令 。
分类讨论:
如果能用 次将其全部补到 ,那当然最好。如果 还没有用完,那就接着补齐,可以证明此时的 一定最大。
否则,这个数列的 一定不会超过 ,枚举这个 从 到 ,很简单做出 的做法。
怎么办呢?设现在枚举到 ,注意到 中的数一定在区间 中的一个,前缀和优化就可以做到 检查。
总复杂度 。#include<bits/stdc++.h> #define copying using #define is namespace #define shameless std #define int long long copying is shameless; int n,total; int k; int a[300005]; int t[300005],pret[300005]; signed main(){ scanf("%lld%lld",&n,&k); int maxval=0; for(int i=1;i<=n;i++){ scanf("%lld",a+i); ++t[a[i]]; total+=a[i]; maxval=max(maxval,a[i]); } int diff=0; for(int i=1;i<=n;i++){ diff+=maxval-a[i]; } if(k>=diff){ printf("%lld",maxval+(k-diff)/n); exit(0); } for(int i=1;i<=maxval;i++){ pret[i]=t[i]+pret[i-1]; } for(int i=maxval;i>1;i--){ int ans=0; int x; for(x=i;x-i<maxval;x+=i){ if(x<=maxval)ans+=(pret[x]-pret[x-i])*x; else ans+=(n-pret[x-i])*x; } ans-=total; if(ans<=k)printf("%lld",i),exit(0); } puts("1"); return 0; }
Information
- ID
- 610
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 8
- Tags
- (None)
- # Submissions
- 37
- Accepted
- 7
- Uploaded By