Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <cstdio>
- #include <cstring>
- #include <cmath>
- #include <string>
- using namespace std;
- int n;
- int have[500];
- const int MX = 1500;
- int MX_BAS = 60;
- int dp[2][MX + 20][2 * MX + 100];
- const int MID = MX + 50;
- int abs(int val) {
- return val > 0 ? val : -val;
- }
- int s[410];
- int sum = 1500;
- void prep() {
- for (int i=2; i<=400; i++) {
- for (int mx = 1500; mx >=0; mx--) {
- int cur = 0;
- int add = mx;
- bool can = true;
- for (int u=0; u<i; u++) {
- cur += add;
- if (cur > sum) {
- can = false;
- break;
- }
- add--;
- if (add < 0) add = 0;
- }
- if (can) {
- s[i] = mx + 1;
- break;
- }
- }
- }
- }
- int main() {
- cin >> n;
- int sum = 0;
- for (int i = 0; i < n; i++) {
- cin >> have[i];
- sum += have[i];
- }
- for (int j = 0; j <= MX; j++) {
- for (int k = -MX; k <= MX; k++) {
- dp[0][j][MID + k] = 1000000000;
- }
- }
- int curSum = 0;
- prep();
- MX_BAS = 1500;
- //cout << MX_BAS << endl;
- for (int i = 0; i <= MX_BAS; i++) {
- dp[0][i][MID + have[0] - i] = abs(have[0] - i);
- }
- for (int i = 0; i < n - 1; i++) {
- int cm = i & 1;
- for (int j = 0; j <= MX_BAS; j++) {
- for (int k = -MX; k <= MX; k++) {
- dp[cm ^ 1][j][MID + k] = 1000000000;
- }
- }
- for (int j = 0; j <= MX_BAS; j++) {
- for (int k = -MX; k <= MX; k++) {
- for (int f = -1; f < 2; f++) {
- if (j + f >= 0) {
- int fre = k + have[i + 1] - j - f;
- dp[cm ^ 1][j + f][MID + fre] = min(dp[cm ^ 1][j + f][MID + fre], dp[cm][j][k + MID] + abs(fre));
- }
- }
- }
- }
- }
- int res = 1000000000;
- for (int i = 0; i <= MX_BAS; i++) {
- res = min(res, dp[(n - 1) & 1][i][MID]);
- }
- cout << res << endl;
- return 0;
- }
Add Comment
Please, Sign In to add comment