Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*░░░░░░░▄▄▄▀▀▀▄▄███▄
- ░░░░░▄▀▀░░░░░░░▐░▀██▌
- ░░░▄▀░░░░▄▄███░▌▀▀░▀█
- ░░▄█░░▄▀▀▒▒▒▒▒▄▐░░░░█▌
- ░▐█▀▄▀▄▄▄▄▀▀▀▀▌░░░░░▐█▄
- ░▌▄▄▀▀░░░░░░░░▌░░░░▄███████▄
- ░░░░░░░░░░░░░▐░░░░▐███████████▄
- ░░░░░le░░░░░░░▐░░░░▐█████████████▄
- ░░░░toucan░░░░░░▀▄░░░▐██████████████▄
- ░░░░░░has░░░░░░░░▀▄▄████████████████▄
- ░░░░░arrived░░░░░░░░░░░░█▀██████*/
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef long double ld;
- const int MAXN = 1007, MAXP = 103;
- const ll INF = (ll)1e18;
- ll dp[2][MAXN * MAXP];
- int p[MAXN];
- int ps[MAXN];
- int main()
- {
- #ifdef LOCAL
- freopen("input.txt", "r", stdin);
- #endif
- int n, m;
- scanf("%d %d", &n, &m);
- int sum = 0;
- for (int i = 1; i <= m; i++)
- {
- scanf("%d", &p[i]);
- sum += p[i];
- }
- sort(p + 1, p + 1 + m);
- reverse(p + 1, p + 1 + m);
- for (int i = 1; i <= m; i++)
- {
- ps[i] = ps[i - 1] + p[i];
- }
- for (int i = 0; i < 2; i++)
- {
- for (int j = 0; j <= sum; j++)
- {
- dp[i][j] = -INF;
- }
- }
- int cur = 0, nxt = 1;
- dp[cur][0] = 0;
- for (int i = 1; i <= m; i++)
- {
- for (int j = 0; j <= sum; j++)
- {
- dp[nxt][j] = -INF;
- }
- for (int j = 0; j <= sum; j++)
- {
- int sumLeft = j, sumRight = ps[i - 1] - sumLeft;
- int sumMore = sum - sumLeft - sumRight;
- int dist = n - i + 1;
- dp[nxt][j + p[i]] = max(dp[nxt][j + p[i]], dp[cur][j] + 1LL * sumMore * (sumLeft) + 1LL * p[i] * sumRight * dist);
- dp[nxt][j] = max(dp[nxt][j], dp[cur][j] + 1LL * sumMore * (sumRight) + 1LL * p[i] * sumLeft * dist);
- }
- /*for (int j = 0; j <= sum; j++)
- {
- cerr << i << " " << j << " " << dp[nxt][j] << endl;
- }*/
- swap(cur, nxt);
- }
- ll res = 0;
- for (int i = 0; i <= sum; i++)
- {
- res = max(res, dp[cur][i]);
- }
- printf("%lld\n", res);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement