Guest User

Untitled

a guest
Jun 19th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.69 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <cmath>
  6. #include <string>
  7.  
  8. using namespace std;
  9.  
  10. int n;
  11. int have[500];
  12.  
  13. const int MX = 1500;
  14. int MX_BAS = 60;
  15.  
  16. int dp[2][MX + 20][2 * MX + 100];
  17.  
  18. const int MID = MX + 50;
  19.  
  20. int abs(int val) {
  21. return val > 0 ? val : -val;
  22. }
  23. int s[410];
  24. int sum = 1500;
  25.  
  26. void prep() {
  27. for (int i=2; i<=400; i++) {
  28. for (int mx = 1500; mx >=0; mx--) {
  29. int cur = 0;
  30. int add = mx;
  31. bool can = true;
  32. for (int u=0; u<i; u++) {
  33. cur += add;
  34. if (cur > sum) {
  35. can = false;
  36. break;
  37. }
  38. add--;
  39. if (add < 0) add = 0;
  40. }
  41. if (can) {
  42. s[i] = mx + 1;
  43. break;
  44. }
  45. }
  46. }
  47. }
  48.  
  49.  
  50. int main() {
  51.  
  52. cin >> n;
  53. int sum = 0;
  54.  
  55. for (int i = 0; i < n; i++) {
  56. cin >> have[i];
  57. sum += have[i];
  58. }
  59.  
  60. for (int j = 0; j <= MX; j++) {
  61. for (int k = -MX; k <= MX; k++) {
  62. dp[0][j][MID + k] = 1000000000;
  63. }
  64. }
  65. int curSum = 0;
  66. prep();
  67. MX_BAS = 1500;
  68. //cout << MX_BAS << endl;
  69.  
  70. for (int i = 0; i <= MX_BAS; i++) {
  71. dp[0][i][MID + have[0] - i] = abs(have[0] - i);
  72. }
  73. for (int i = 0; i < n - 1; i++) {
  74. int cm = i & 1;
  75. for (int j = 0; j <= MX_BAS; j++) {
  76. for (int k = -MX; k <= MX; k++) {
  77. dp[cm ^ 1][j][MID + k] = 1000000000;
  78. }
  79. }
  80. for (int j = 0; j <= MX_BAS; j++) {
  81. for (int k = -MX; k <= MX; k++) {
  82. for (int f = -1; f < 2; f++) {
  83. if (j + f >= 0) {
  84. int fre = k + have[i + 1] - j - f;
  85. dp[cm ^ 1][j + f][MID + fre] = min(dp[cm ^ 1][j + f][MID + fre], dp[cm][j][k + MID] + abs(fre));
  86. }
  87. }
  88. }
  89. }
  90. }
  91.  
  92. int res = 1000000000;
  93. for (int i = 0; i <= MX_BAS; i++) {
  94. res = min(res, dp[(n - 1) & 1][i][MID]);
  95. }
  96. cout << res << endl;
  97.  
  98. return 0;
  99. }
Add Comment
Please, Sign In to add comment