Advertisement
Guest User

Untitled

a guest
Sep 28th, 2016
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.27 KB | None | 0 0
  1. /*░░░░░░░▄▄▄▀▀▀▄▄███▄
  2. ░░░░░▄▀▀░░░░░░░▐░▀██▌
  3. ░░░▄▀░░░░▄▄███░▌▀▀░▀█
  4. ░░▄█░░▄▀▀▒▒▒▒▒▄▐░░░░█▌
  5. ░▐█▀▄▀▄▄▄▄▀▀▀▀▌░░░░░▐█▄
  6. ░▌▄▄▀▀░░░░░░░░▌░░░░▄███████▄
  7. ░░░░░░░░░░░░░▐░░░░▐███████████▄
  8. ░░░░░le░░░░░░░▐░░░░▐█████████████▄
  9. ░░░░toucan░░░░░░▀▄░░░▐██████████████▄
  10. ░░░░░░has░░░░░░░░▀▄▄████████████████▄
  11. ░░░░░arrived░░░░░░░░░░░░█▀██████*/
  12. #include <bits/stdc++.h>
  13. using namespace std;
  14. typedef long long ll;
  15. typedef long double ld;
  16. const int MAXN = 1007, MAXP = 103;
  17. const ll INF = (ll)1e18;
  18. ll dp[2][MAXN * MAXP];
  19. int p[MAXN];
  20. int ps[MAXN];
  21. int main()
  22. {
  23. #ifdef LOCAL
  24. freopen("input.txt", "r", stdin);
  25. #endif
  26. int n, m;
  27. scanf("%d %d", &n, &m);
  28. int sum = 0;
  29. for (int i = 1; i <= m; i++)
  30. {
  31. scanf("%d", &p[i]);
  32. sum += p[i];
  33. }
  34. sort(p + 1, p + 1 + m);
  35. reverse(p + 1, p + 1 + m);
  36. for (int i = 1; i <= m; i++)
  37. {
  38. ps[i] = ps[i - 1] + p[i];
  39. }
  40. for (int i = 0; i < 2; i++)
  41. {
  42. for (int j = 0; j <= sum; j++)
  43. {
  44. dp[i][j] = -INF;
  45. }
  46. }
  47. int cur = 0, nxt = 1;
  48. dp[cur][0] = 0;
  49. for (int i = 1; i <= m; i++)
  50. {
  51. for (int j = 0; j <= sum; j++)
  52. {
  53. dp[nxt][j] = -INF;
  54. }
  55. for (int j = 0; j <= sum; j++)
  56. {
  57. int sumLeft = j, sumRight = ps[i - 1] - sumLeft;
  58. int sumMore = sum - sumLeft - sumRight;
  59. int dist = n - i + 1;
  60. dp[nxt][j + p[i]] = max(dp[nxt][j + p[i]], dp[cur][j] + 1LL * sumMore * (sumLeft) + 1LL * p[i] * sumRight * dist);
  61. dp[nxt][j] = max(dp[nxt][j], dp[cur][j] + 1LL * sumMore * (sumRight) + 1LL * p[i] * sumLeft * dist);
  62. }
  63. /*for (int j = 0; j <= sum; j++)
  64. {
  65. cerr << i << " " << j << " " << dp[nxt][j] << endl;
  66. }*/
  67. swap(cur, nxt);
  68. }
  69. ll res = 0;
  70. for (int i = 0; i <= sum; i++)
  71. {
  72. res = max(res, dp[cur][i]);
  73. }
  74. printf("%lld\n", res);
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement