这两份代码有什么不同
查看原帖
这两份代码有什么不同
671013
KawaragiMomoka楼主2024/5/4 11:51

这个80pts

#include <bits/stdc++.h>
using namespace std;

const int maxn = 55;
const int maxm = 15;
int n, m;
int sum[maxn << 1], arr[maxn << 1];
int f[maxn << 1][maxn << 1][maxm];
int g[maxn << 1][maxn << 1][maxm];

inline int mod(int x) {
    return (x % 10 + 10) % 10;
}

int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &arr[i]);
        arr[i + n] = arr[i];
    }
    for (int i = 1; i <= (n << 1); i++) {
        sum[i] = sum[i - 1] + arr[i];
    }
    memset(g, 0x3f, sizeof(g));
    for (int i = 1; i <= (n << 1); i++) {
        for (int j = i; j <= (n << 1); j++) {
            f[i][j][1] = mod(sum[j] - sum[i - 1]);
            g[i][j][1] = mod(sum[j] - sum[i - 1]);
        }
    }
    int maxv = 0, minv = 0x3f3f3f3f;
    for (int part = 2; part <= m; part++) {
        for (int i = 1; i <= (n << 1); i++) {
            for (int j = i + part - 1; j <= (n << 1); j++) {
                for (int k = i + part - 2; k < j; k++) {
                    f[i][j][part] = max(f[i][j][part], f[i][k][part - 1] * mod(sum[j] - sum[k]));
                    g[i][j][part] = min(g[i][j][part], g[i][k][part - 1] * mod(sum[j] - sum[k]));
                    if (part == m && (j - i + 1) == n) {
                        maxv = max(maxv, f[i][j][part]); // HERE
                        minv = min(minv, g[i][j][part]);
                    }
                }
            }
        }
    }
    printf("%d\n%d", minv, maxv);
    return 0;
}

这个100pts

#include <bits/stdc++.h>
using namespace std;

const int maxn = 55;
const int maxm = 15;
int n, m;
int sum[maxn << 1], arr[maxn << 1];
int f[maxn << 1][maxn << 1][maxm];
int g[maxn << 1][maxn << 1][maxm];

inline int mod(int x) {
    return (x % 10 + 10) % 10;
}

int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &arr[i]);
        arr[i + n] = arr[i];
    }
    for (int i = 1; i <= (n << 1); i++) {
        sum[i] = sum[i - 1] + arr[i];
    }
    memset(g, 0x3f, sizeof(g));
    for (int i = 1; i <= (n << 1); i++) {
        for (int j = i; j <= (n << 1); j++) {
            f[i][j][1] = mod(sum[j] - sum[i - 1]);
            g[i][j][1] = mod(sum[j] - sum[i - 1]);
        }
    }
    int maxv = 0, minv = 0x3f3f3f3f;
    for (int part = 2; part <= m; part++) {
        for (int i = 1; i <= (n << 1); i++) {
            for (int j = i + part - 1; j <= (n << 1); j++) {
                for (int k = i + part - 2; k < j; k++) {
                    f[i][j][part] = max(f[i][j][part], f[i][k][part - 1] * mod(sum[j] - sum[k]));
                    g[i][j][part] = min(g[i][j][part], g[i][k][part - 1] * mod(sum[j] - sum[k]));
                }
            }
        }
    }
    for (int i = 1; i <= n; i++) {
        maxv = max(maxv, f[i][i + n - 1][m]); // HERE
        minv = min(minv, g[i][i + n - 1][m]);
    }
    printf("%d\n%d", minv, maxv);
    return 0;
}

2024/5/4 11:51
加载中...