Submission #1354672

#TimeUsernameProblemLanguageResultExecution timeMemory
1354672phamngocphuc2008Monster-Go (EGOI25_monstergo)C++20
100 / 100
1 ms344 KiB
#include <bits/stdc++.h>
using namespace std;

const int inf = numeric_limits<int>::max();

int used = 0;

void print(const vector<int>& v, bool ok = true)
{
    for(auto &i : v) cout << i << ' ';
    if(ok) cout << '\n';
}


void make(int n)
{
    if(n == 1)
    {
        for(int i = used; i < used + 12; ++i) cout << i << ' ';
        cout << '\n';
        used += 12;
    }
    else if(12 %(n-1) == 0)
    {
        int seg = 12 / (n-1);
        vector<vector<int>> v(n, vector<int>(seg));
        for(auto& i : v)
        {
            for(int j = 0; j < seg; ++j)
            {
                i[j] = used;
                ++used;
            }
        }
        for(int i = 0; i < n; ++i)
        {
            for(int j = 0; j < n; ++j)
            {
                if(j != i) print(v[j], 0);
            }
            cout << '\n';
        }
    }

    else if(n == 6)
    {
        vector<vector<int>> seg(4, vector<int>(6));
        for(int i = 0; i < 4; ++i)
        {
            for(int j = 0; j < 6; ++j)
            {
                seg[i][j] = used;
                ++used;
            }
        }
        for(int i = 0; i < 4; ++i)
        {
            for(int j = i+1; j < 4; ++j)
            {
                print(seg[i], 0);
                print(seg[j]);
            }
        }
    }

    else if(n == 10)
    {
        vector<vector<int>> seg(5, vector<int>(4));
        for(int i = 0; i < seg.size(); ++i)
        {
            for(int j = 0; j < seg[0].size(); ++j)
            {
                seg[i][j] = used;
                ++used;
            }
        }
        for(int i = 0; i < seg.size(); ++i)
        {
            for(int j = i+1; j < seg.size(); ++j)
            {
                for(int k = j+1; k < seg.size(); ++k)
                {
                    print(seg[i], 0);
                    print(seg[j], 0);
                    print(seg[k]);
                }
            }
        }
    }
    else if(n == 15)
    {
        vector<vector<int>> seg(6, vector<int>(3));
        for(int i = 0; i < seg.size(); ++i)
        {
            for(int j = 0; j < seg[0].size(); ++j)
            {
                seg[i][j] = used;
                ++used;
            }
        }
        for(int i1 = 0; i1 < seg.size(); ++i1)
        {
            for(int i2 = i1+1; i2 < seg.size(); ++i2)
            {
                for(int i3 = i2+1; i3 < seg.size(); ++i3)
                {
                    for(int i4 = i3+1; i4 < seg.size(); ++i4)
                    {
                        print(seg[i1], 0);
                        print(seg[i2], 0);
                        print(seg[i3], 0);
                        print(seg[i4]);
                    }

                }
            }
        }
    }
    else if(n == 35)
    {
        vector<vector<int>> seg(7, vector<int>(3));
        for(int i = 0; i < seg.size(); ++i)
        {
            for(int j = 0; j < seg[0].size(); ++j)
            {
                seg[i][j] = used;
                ++used;
            }
        }
        for(int i1 = 0; i1 < seg.size(); ++i1)
        {
            for(int i2 = i1+1; i2 < seg.size(); ++i2)
            {
                for(int i3 = i2+1; i3 < seg.size(); ++i3)
                {
                    for(int i4 = i3+1; i4 < seg.size(); ++i4)
                    {
                        print(seg[i1], 0);
                        print(seg[i2], 0);
                        print(seg[i3], 0);
                        print(seg[i4]);
                    }

                }
            }
        }
    }
    else if(n == 28)
    {
        vector<vector<int>> seg(8, vector<int>(2));
        for(int i = 0; i < seg.size(); ++i)
        {
            for(int j = 0; j < seg[0].size(); ++j)
            {
                seg[i][j] = used;
                ++used;
            }
        }
        for(int i1 = 0; i1 < seg.size(); ++i1)
        {
            for(int i2 = i1+1; i2 < seg.size(); ++i2)
            {
                for(int i3 = i2+1; i3 < seg.size(); ++i3)
                {
                    for(int i4 = i3+1; i4 < seg.size(); ++i4)
                    {
                        for(int i5 = i4+1; i5 < seg.size(); ++i5)
                        {
                            for(int i6 = i5+1; i6 < seg.size(); ++i6)
                            {
                                print(seg[i1], 0);
                                print(seg[i2], 0);
                                print(seg[i3], 0);
                                print(seg[i4], 0);
                                print(seg[i5], 0);
                                print(seg[i6]);
                            }
                        }
                    }
                }
            }
        }
    }

}

bool chmin(int &a, int b)
{
    bool r = a > b;
    a = min(a,b);
    return r;
}

int main()
{

    int n;
    cin >> n;

    map<int,int> vc;
    vc[1] = 12;
    vc[2] = 24;
    vc[3] = 18;
    vc[4] = 16;
    vc[5] = 15;
    vc[6] = 24;
    vc[7] = 14;
    vc[10] = 20;
    vc[13] = 13;
    vc[15] = 18;
    vc[28] = 16;
    vc[35] = 21;

    vector<int> dp(51, inf);
    dp[0] = 0;
    vector<vector<int>> ans(51);
    for(int i = 1; i <= 50; ++i)
    {
        for(auto [val, c] : vc)
        {
            if(i >= val)
            {
                if(chmin(dp[i], dp[i-val]+c))
                {
                    ans[i] = ans[i-val];
                    ans[i].push_back(val);
                }
            }
        }
    }
    for(auto i : ans[n]) make(i);

}
#Result Execution timeMemoryGrader output
Fetching results...