8352 2024. 01. 14 23:21:26 TuruTamas Festés (50 pont) cpp17 Időlimit túllépés 10/50 702ms 35676 KiB
#include <bits/stdc++.h>
using namespace std;

#ifdef DEBUG
ifstream in_file("minta/be1.txt");
#define input in_file
#define INTHENAMEOFGOD
#else
#define input cin
#define INTHENAMEOFGOD \
    ios::sync_with_stdio(0); \
    cin.tie(0); \
    cout.tie(0);
#endif
typedef long long ll;
typedef vector<ll> vi;
typedef vector<vi> vvi;
typedef vector<bool> vb;
typedef array<ll, 2> pii;

ll N, M, a, ans = LLONG_MAX;

vector<set<ll>> f(ll i) {
    vector<set<ll>> ret;
    for (ll l = 0; l <= i; l++) {
        for (ll r = i; r < N; r++) {
            set<ll> s;
            for (ll i = l; i <= r; i++)
                s.insert(i);
            ret.push_back(s);
        }
    }
    return ret;
}

vector<vector<set<ll>>> vvs;
vector<vvi> C;
vi R;
set<ll> s, festett;

ll g(set<ll>::iterator it, ll m) {
    if (it == s.end())
        return 0;
    if (festett.count(*it))
        return g(++it, m);
    
    ll r = LLONG_MAX;
    for (auto range : vvs[*it]) {
        ll first = *range.begin();
        ll last = *range.rbegin();
        set<ll> to_remove;
        for (ll val : range) {
            if (festett.insert(val).second) {
                to_remove.insert(val);
            }
        }
        auto nit = it;
        nit++;
        r = min(r, C[m][first][last] + g(nit, m));
        for (ll val : to_remove)
            festett.erase(val);
    }
    return r;
}

void call_g(ll i) {
    if (i == N) {
        ll ans_tmp = 0;
        for (ll m = 0; m < M; m++) {
            ans_tmp += g(s.begin(), m);
        }
        for (ll sor = 0; sor < N; sor++) {
            if (!s.count(sor))
                ans_tmp += R[sor];
        }
        ans = min(ans, ans_tmp);
    } else {
        call_g(i+1);
        s.insert(i);
        call_g(i+1);
        s.erase(i);
    }
}

int main() {
    INTHENAMEOFGOD
    input >> N >> M;

    R.resize(N);
    for (ll &val : R)
        input >> val;

    C.resize(M);
    for (ll m = 0; m < M; m++) {
        C[m].resize(N);
        for (ll l = 0; l < N; l++) {
            C[m][l].resize(N);
            for (ll r = l; r < N; r++) {
                input >> C[m][l][r];
            }
        }
    }

    vvs.resize(N);
    for (ll n = 0; n < N; n++) {
        vvs[n] = f(n);
    }

    call_g(0);
    cout << ans << "\n";
}
Részfeladat Összpont Teszt Verdikt Idő Memória
base 10/50
1 Elfogadva 0/0 3ms 2076 KiB
2 Elfogadva 0/0 4ms 2180 KiB
3 Időlimit túllépés 0/2 667ms 21332 KiB
4 Elfogadva 2/2 13ms 2772 KiB
5 Elfogadva 3/3 108ms 3420 KiB
6 Időlimit túllépés 0/2 658ms 5360 KiB
7 Időlimit túllépés 0/2 702ms 34312 KiB
8 Időlimit túllépés 0/2 647ms 34328 KiB
9 Időlimit túllépés 0/2 667ms 34464 KiB
10 Időlimit túllépés 0/2 676ms 34772 KiB
11 Időlimit túllépés 0/2 661ms 34720 KiB
12 Időlimit túllépés 0/2 648ms 32340 KiB
13 Időlimit túllépés 0/2 669ms 32524 KiB
14 Elfogadva 2/2 216ms 33632 KiB
15 Elfogadva 3/3 216ms 33464 KiB
16 Időlimit túllépés 0/3 667ms 22984 KiB
17 Időlimit túllépés 0/2 656ms 23132 KiB
18 Időlimit túllépés 0/3 667ms 23008 KiB
19 Időlimit túllépés 0/2 657ms 32468 KiB
20 Időlimit túllépés 0/2 685ms 34164 KiB
21 Időlimit túllépés 0/2 680ms 35440 KiB
22 Időlimit túllépés 0/2 657ms 35664 KiB
23 Időlimit túllépés 0/2 644ms 35676 KiB
24 Időlimit túllépés 0/2 652ms 35612 KiB
25 Időlimit túllépés 0/2 657ms 35672 KiB