답안 #804600

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
804600 2023-08-03T10:08:29 Z mousebeaver Cookies (JOI23_cookies) C++14
19 / 100
1000 ms 5744 KB
#define ll long long
#define INF numeric_limits<ll>::max()/2
#define pll pair<ll, ll>
#include <bits/stdc++.h>
using namespace std;

void dfs(vector<vector<ll>>& output, ll cookies, vector<ll>& current, vector<ll>& a, vector<ll>& b)
{
    if(cookies > 0)
    {
        ll start = 0;
        if(current.size())
            start = current.back();
        for(ll j = start; j < (int) b.size() && b[j] <= cookies; j++)
        {
            current.push_back(j);
            dfs(output, cookies-b[j], current, a, b);
            current.pop_back();
        }
    }
    else
    {
        //Test the given state!!!
        if(output.size() && current.size() > output.size()) //No improvement possible
        {
            return;
        }

        vector<vector<ll>> res(current.size(), vector<ll> (0)); //pre-output
        priority_queue<pll, vector<pll>, less<pll>> q; //Free, index
        for(ll i = 0; i < (int) current.size(); i++)
        {
            q.push({b[current[i]], i});
        }

        for(ll i = 0; i < (int) a.size(); i++)
        {
            if(a[i] > (int) current.size())
            {
                return;
            }

            vector<pll> used(0); //Free, index
            for(ll j = 0; j < a[i]; j++)
            {
                ll c, index;
                tie(c, index) = q.top();
                if(c == 0)
                {
                    return;
                }
                q.pop();
                used.push_back({c-1, index});
                res[index].push_back(i+1);
            }
            for(pll p : used)
            {
                q.push(p);
            }            
        }

        output = res;
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    /*//Testing something!!!
    vector<ll> dp(16, 1);
    for(ll i = 2; i <= 15; i++)
    {
        for(ll j = 0; j+i <= 15; j++)
        {
            dp[j+i] += dp[j];
        }
    }
    cout<<"TEST: "<<dp[15]<<endl;
    return 0;*/

    bool sub1 = true;

    ll n;
    cin>>n;
    vector<ll> a(n);
    for(ll i = 0; i < n; i++)
    {
        cin>>a[i];
        if(a[i] != 1 || n > 500)
        {
            sub1 = false;
        }
    }
    ll m;
    cin>>m;
    vector<ll> b(m);
    for(ll i = 0; i < m; i++)
    {
        cin>>b[i];
    }

    if(false) //sub1
    {
        //Subtask 1:
        vector<pll> dp(n+1, {INF, -1}); //Number, last
        dp[0] = {0, 0};
        for(ll i = 0; i < n; i++)
        {
            for(ll j = 0; j < m && i+b[j] <= n; j++)
            {
                if(dp[i].first+1 < dp[i+b[j]].first)
                {
                    dp[i+b[j]].first = dp[i].first+1;
                    dp[i+b[j]].second = j;
                }
            }
        }

        if(dp[n].first == INF)
        {
            cout<<-1<<"\n";
        }
        else
        {
            cout<<dp[n].first<<"\n";
            ll k = n;
            ll counter = 1;
            while(k > 0)
            {
                ll box = b[dp[k].second];
                k -= box;
                cout<<box<<" ";
                while(box > 0)
                {
                    cout<<counter<<" ";
                    counter++;
                    box--;
                }
                cout<<"\n";
            }
        }
        return 0;
    }

    if(false) //m == 1
    {
        //Subtask 2:
        ll sum = 0;
        for(ll i : a)
        {
            sum += i;
        }
        
        if(sum%b[0] != 0 || *max_element(a.begin(), a.end()) > sum/b[0])
        {
            cout<<-1<<"\n";
        }
        else
        {
            vector<vector<ll>> output(sum/b[0], vector<ll> (0));
            priority_queue<pll, vector<pll>, greater<pll>> q; //Contained, index
            for(ll i = 0; i < sum/b[0]; i++)
            {
                q.push({0, i});
            }

            for(ll i = 0; i < n; i++)
            {
                vector<pll> used(0); //Contained, index
                for(ll j = 0; j < a[i]; j++)
                {
                    ll c, index;
                    tie(c, index) = q.top();
                    q.pop();
                    used.push_back({c+1, index});
                    output[index].push_back(i+1);
                }
                for(pll p : used)
                {
                    q.push(p);
                }
            }

            cout<<sum/b[0]<<"\n";
            for(ll i = 0; i < sum/b[0]; i++)
            {
                cout<<b[0]<<" ";
                for(ll j : output[i])
                {
                    cout<<j<<" ";
                }
                cout<<"\n";
            }
        }
        return 0;
    }

    //Subtask 3:
    vector<ll> current(0);
    vector<vector<ll>> output(0);
    ll sum = 0;
    for(ll i : a)
    {
        sum += i;
    }
    dfs(output, sum, current, a, b);
    
    if(output.empty())
    {
        cout<<-1<<"\n";
    }
    else
    {
        cout<<output.size()<<"\n";
        for(ll i = 0; i < (int) output.size(); i++)
        {
            cout<<output[i].size()<<" ";
            for(ll j : output[i])
            {
                cout<<j<<" ";
            }
            cout<<"\n";
        }
    }

    return 0;  
}

Compilation message

cookies.cpp: In function 'int main()':
cookies.cpp:83:10: warning: variable 'sub1' set but not used [-Wunused-but-set-variable]
   83 |     bool sub1 = true;
      |          ^~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 320 KB Output is correct
3 Correct 0 ms 316 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Correct 1 ms 468 KB Output is correct
9 Correct 0 ms 320 KB Output is correct
10 Execution timed out 1071 ms 512 KB Time limit exceeded
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 320 KB Output is correct
5 Correct 1 ms 468 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 1 ms 468 KB Output is correct
9 Correct 3 ms 1364 KB Output is correct
10 Correct 8 ms 5744 KB Output is correct
11 Correct 2 ms 216 KB Output is correct
12 Correct 1 ms 212 KB Output is correct
13 Correct 1 ms 212 KB Output is correct
14 Correct 1 ms 212 KB Output is correct
15 Correct 1 ms 212 KB Output is correct
16 Correct 1 ms 340 KB Output is correct
17 Correct 1 ms 212 KB Output is correct
18 Correct 5 ms 1748 KB Output is correct
19 Correct 7 ms 2260 KB Output is correct
20 Correct 3 ms 724 KB Output is correct
21 Correct 3 ms 596 KB Output is correct
22 Correct 3 ms 596 KB Output is correct
23 Correct 1 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 1 ms 328 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Correct 0 ms 320 KB Output is correct
9 Correct 1 ms 212 KB Output is correct
10 Correct 1 ms 212 KB Output is correct
11 Correct 1 ms 212 KB Output is correct
12 Correct 1 ms 212 KB Output is correct
13 Correct 0 ms 212 KB Output is correct
14 Correct 0 ms 212 KB Output is correct
15 Correct 1 ms 212 KB Output is correct
16 Correct 1 ms 212 KB Output is correct
17 Correct 1 ms 316 KB Output is correct
18 Correct 1 ms 212 KB Output is correct
19 Correct 1 ms 320 KB Output is correct
20 Correct 0 ms 212 KB Output is correct
21 Correct 1 ms 212 KB Output is correct
22 Correct 0 ms 320 KB Output is correct
23 Correct 1 ms 320 KB Output is correct
24 Correct 1 ms 212 KB Output is correct
25 Correct 0 ms 212 KB Output is correct
26 Correct 1 ms 212 KB Output is correct
27 Correct 1 ms 212 KB Output is correct
28 Correct 0 ms 212 KB Output is correct
29 Correct 1 ms 212 KB Output is correct
30 Correct 1 ms 216 KB Output is correct
31 Correct 1 ms 212 KB Output is correct
32 Correct 1 ms 212 KB Output is correct
33 Correct 0 ms 216 KB Output is correct
34 Correct 1 ms 220 KB Output is correct
35 Correct 1 ms 324 KB Output is correct
36 Correct 1 ms 324 KB Output is correct
37 Correct 1 ms 220 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 320 KB Output is correct
3 Correct 0 ms 316 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Correct 1 ms 468 KB Output is correct
9 Correct 0 ms 320 KB Output is correct
10 Execution timed out 1071 ms 512 KB Time limit exceeded
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 320 KB Output is correct
3 Correct 0 ms 316 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Correct 1 ms 468 KB Output is correct
9 Correct 0 ms 320 KB Output is correct
10 Execution timed out 1071 ms 512 KB Time limit exceeded
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 320 KB Output is correct
3 Correct 0 ms 316 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Correct 1 ms 468 KB Output is correct
9 Correct 0 ms 320 KB Output is correct
10 Execution timed out 1071 ms 512 KB Time limit exceeded
11 Halted 0 ms 0 KB -