Codeforces830C(思维)

xiaoxiao2021-02-27  158

题意:给出一排数列,然后要求出一个d,使得将数列中的数变成d的整数倍之后与原来的相差之和要小于k,求d的最大值。

思路:相当于将数列中的数变成整数倍之后的数要小于sum = k + sigma(a[i])。因为是整数倍,所以不考虑剩余,直接将d枚举成sum的因子,然后看是否符合。

#include<bits/stdc++.h> using namespace std; const int maxn = 1000 + 10; typedef long long ll; typedef pair<ll,ll> P; int n; ll m; int a[maxn]; ll calc(ll d) { ll ret = 0; for(int i = 1;i <= n; i ++) { ret += 1LL * (a[i] + d - 1)/d * d; } return ret; } int main() { while( ~ scanf("%d%I64d",&n,&m)) { ll sum = m; for(int i = 1; i <= n; i ++)scanf("%d",&a[i]),sum += a[i]; ll ans = 0; for(ll i = 1; i * i <= sum; i ++) { ll temp = calc(i); if(temp <= sum)ans = max(ans,i); temp = calc(sum / i); if(temp <= sum)ans = max(ans,sum / i); } printf("%I64d\n",ans); } return 0; }

转载请注明原文地址: https://www.6miu.com/read-14454.html

最新回复(0)