답안 #892020

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
892020 2023-12-24T16:10:42 Z alexander707070 Cookies (JOI23_cookies) C++14
0 / 100
145 ms 496000 KB
#include<bits/stdc++.h>
#pragma GCC optimize ("O3")
#pragma GCC target ("sse4")
#define MAXN 3007
using namespace std;

int n,m,pt,total;
int a[MAXN],b[MAXN],ind[MAXN];

vector< pair<int,int> > v;
vector< vector<int> > w;

int maxs[MAXN],br;
unordered_map<short,short> dp[MAXN][MAXN];

short z=1;

void calc_dp(){
    for(int pos=total;pos>=1;pos--){
        for(int box=1;box<=m;box++){
            for(int sum=max(0,total-(pos-1)*b[m]);sum<=total-(pos-1)*b[box];sum++){

                if(sum==0){
                    dp[box][sum][pos]=0;
                    continue;
                }

                dp[box][sum][pos]=20000;

                if(box>1)dp[box][sum][pos]=dp[box-1][sum][pos];

                if(total-sum+b[box]<=maxs[pos] and sum-b[box]>=0 and dp[box][sum][pos]>dp[box][sum][pos],dp[box][sum-b[box]][pos+1]+z){
                    dp[box][sum][pos]=dp[box][sum][pos],dp[box][sum-b[box]][pos+1]+z;
                }
            }
        }
    }
}

void solve(int pos,int box,int sum){
    if(sum==0)return;

    if(box>1 and dp[box][sum][pos]==dp[box-1][sum][pos]){
        solve(pos,box-1,sum); return;
    }

    br++; v.push_back({b[box],br});
    solve(pos+1,box,sum-b[box]);
}

bool cmp(int x,int y){
    return a[x]>a[y];
}

int main(){

    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        total+=a[i];
        ind[i]=i;
    }
    
    for(int i=1;i<=total;i++){
        for(int f=1;f<=n;f++){
            maxs[i]+=min(a[f],i);
        }
    }

    cin>>m;
    for(int i=1;i<=m;i++){
        cin>>b[i];
    }

    calc_dp();

    if(dp[m][total][1]>total){
        cout<<"-1\n";
        return 0;
    }

    solve(1,m,total);
    w.resize(int(v.size()));

    sort(ind+1,ind+n+1,cmp);

    for(int i=1;i<=n;i++){
        sort(v.begin(),v.end());
        reverse(v.begin(),v.end());

        for(int f=0;f<a[ind[i]];f++){
            v[f].first--;
            w[v[f].second-1].push_back(ind[i]);
        }
    }

    cout<<w.size()<<"\n";
    for(int i=0;i<w.size();i++){
        cout<<w[i].size()<<" ";
        for(int f:w[i])cout<<f<<" ";
        cout<<"\n";
    }

    return 0;
}

Compilation message

cookies.cpp: In function 'void calc_dp()':
cookies.cpp:33:83: warning: value computed is not used [-Wunused-value]
   33 |                     dp[box][sum][pos]=dp[box][sum][pos],dp[box][sum-b[box]][pos+1]+z;
cookies.cpp: In function 'int main()':
cookies.cpp:102:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  102 |     for(int i=0;i<w.size();i++){
      |                 ~^~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 145 ms 495700 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 113 ms 495696 KB Output is correct
2 Incorrect 117 ms 496000 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 113 ms 495700 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 145 ms 495700 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 145 ms 495700 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 145 ms 495700 KB Output isn't correct
2 Halted 0 ms 0 KB -