제출 #1221735

#제출 시각아이디문제언어결과실행 시간메모리
1221735noyancanturkCookies (JOI23_cookies)C++20
0 / 100
0 ms328 KiB
#include<bits/stdc++.h> using namespace std; #define pb push_back using pii=pair<int,int>; const int lim=15010; int a[lim],b[lim]; int bad[lim],past1[lim]; int good[lim],past2[lim]; int main(){ int n; cin>>n; int sm=0; int mx=0; for(int i=0;i<n;i++)cin>>a[i],sm+=a[i],mx=max(mx,a[i]); int m; cin>>m; for(int i=0;i<m;i++)cin>>b[i]; for(int i=1;i<lim;i++){ bad[i]=INT_MIN; good[i]=INT_MAX; } for(int i=0;i<sm;i++){ if(bad[i]!=INT_MIN){ for(int j=0;j<m;j++){ if(sm<i+b[j])break; if(bad[i+b[j]]<bad[i]+1){ bad[i+b[j]]=bad[i]+1; past1[i+b[j]]=b[j]; } if(good[i]+1<good[i+b[j]]){ good[i+b[j]]=good[i]+1; past2[i+b[j]]=b[j]; } } } } if(good[sm]==INT_MAX){ cout<<-1; return 0; } vector<pii>totr; for(int i=0;i<=sm;i++){ if(bad[i]!=INT_MIN&&good[sm-i]!=INT_MAX&&mx<=bad[i]+good[sm-i]){ totr.pb({bad[i]+good[sm-i],i}); } } sort(totr.begin(),totr.end()); auto f=[&](int t,int pr) -> bool { vector<int>willdo; int ss=totr[t].second; while(ss){ willdo.pb(past1[ss]); ss-=past1[ss]; } ss=sm-totr[t].second; while(ss){ willdo.pb(past2[ss]); ss-=past2[ss]; } int b[n]; for(int i=0;i<n;i++)b[i]=a[i]; priority_queue<pii>pq; for(int i=0;i<n;i++)pq.push({b[i],i}); for(int sz:willdo){ if(pr)cout<<sz<<' '; vector<int>used; while(sz--){ auto[x,y]=pq.top(); pq.pop(); if(pr)cout<<y+1<<' '; used.pb(y); b[y]--; } if(pr)cout<<'\n'; for(int j:used){ pq.push({b[j],j}); } } for(int i=0;i<n;i++)if(b[i])return 0; return 1; }; for(int i=0;i<totr.size();i++){ if(f(i,0)){ f(i,1); return 0; } } cout<<-1; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...