SGU 108 (空間優化)

這題本來覺得是道沒什麼的水題,結果沒想到空間卡得這麼死

於是注意觀察式子,發現每個推到後面最多加7 * 9 (7位數,每位是9)

於是就只要開64的空間,利用滾動數組去優化即可

另外還要注意,答案表全打出來也是會MLE的,只能根據輸入的k去存放k個答案

代碼:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int n, k, dp[65], sum[10005];

int get(int x) {
    int sum = 0;
    while (x) {
        sum += x % 10;
        x /= 10;
    }
    return sum;
}

struct A {
    int a, id;
    void read(int id) {
        this->id = id;
        scanf("%d", &a);
    }
} x[5005];

bool cmp(A a, A b) {
    return a.a < b.a;
}

int ans[5005];

int main() {
    for (int i = 1; i <= 10000; i++) sum[i] = get(i);
    scanf("%d%d", &n, &k);
    int out = 0;
    for (int i = 0; i < k; i++)
        x[i].read(i);
    sort(x, x + k, cmp);
    int u = 0;
    for (int i = 1; i <= n; i++) {
        if (!dp[i % 64]) {
            out++;
            while (x[u].a <= out) {
                if (x[u].a == out) ans[x[u].id] = i;
                u++;
            }
        }
        dp[(i + sum[i / 10000] + sum[i % 10000]) % 64] = true;
        dp[i % 64] = false;
    }
    printf("%d\n", out);
    for (int i = 0; i < k; i++)
        printf("%d%c", ans[i], i == k - 1 ? '\n' : ' ');
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章