Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define F first
- #define S second
- int main() {
- #ifdef LOCAL
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- int n;
- cin >> n;
- int a[n];
- int s = 0;
- int i, j, k, q;
- for (i = 0; i < n; i++) {
- cin >> a[i];
- }
- sort(a, a + n);
- int dp[20][a[n - 1] + 2];
- int m[20][a[n - 1] + 2][7];
- for (i = 0; i <= 19; i++) {
- for (j = 0; j <= a[n - 1]; j++) {
- dp[i][j] = 1000000000;
- }
- }
- for (j = 0; j <= a[n - 1]; j++) {
- for (i = 0; i < n; i++) {
- m[19][j][i] = a[i];
- }
- }
- for (j = 1; j <= a[n - 1]; j++) {
- dp[19][j] = 0;
- for (i = 0; i < n; i++) {
- dp[19][j] += a[i] / j;
- m[19][j][i] %= j;
- }
- }
- int last = a[n - 1];
- int E[21];
- for (int i = 1; i <= 19; i++){
- E[i] = min(1 << i, last);
- }
- int add;
- int p;
- for (i = 18; i >= 1; i--) {
- for (j = 1; j <= E[i]; j++) {
- p = 1;
- for (k = j; k <= E[i + 1]; k += j) {
- add = 0;
- for (q = 0; q < n; q++) {
- add += m[i + 1][k][q] / j;
- }
- if (dp[i][j] > dp[i + 1][k] + add) {
- dp[i][j] = dp[i + 1][k] + add;
- p = k;
- }
- }
- for (q = 0; q < n; q++) {
- m[i][j][q] = m[i + 1][p][q] % j;
- }
- }
- }
- cout << dp[1][1];
- #ifdef TIME
- cerr << "TIME = " << 1. * clock() / CLOCKS_PER_SEC;
- #endif
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement