This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int INF = 1e12;
int32_t main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<pair<int,int>> arr(n);
int tot = 0;
for(int i=0;i<n;i++){cin>>arr[i].first;tot+=arr[i].first;arr[i].second=i+1;}
vector<int> limits(tot+1,INF);
sort(arr.rbegin(),arr.rend());
vector<int> cookies = {-1};
while(arr[0].first){
for(int j=0;j<n;j++){
if(arr[j].first==0)break;
arr[j].first--;
cookies.emplace_back(arr[j].second);
}
}
for(int i=1;i<=tot;i++){
vector<bool> present(n+1);
for(int j=i+1;j<=tot;j++){
if(present[cookies[j]]){
limits[i]=j-i-1;
break;
}
present[cookies[j]]=true;
}
limits[i]=min(limits[i],tot-i);
}
int m;
cin >> m;
vector<int> weights(m);
for(int&i:weights)cin>>i;
vector<pair<int,int>> DP(tot+1,{INF,0});
DP[0].first = 0;
int curr_limit = tot;
for(int i=0;i<=tot;i++){
curr_limit=min(curr_limit,limits[i]);
for(int j=0;j<m;j++){
if(weights[j]>curr_limit)break;
DP[i+weights[j]]=min(DP[i+weights[j]],{DP[i].first+1,i});
}
}
if(DP[tot].first>=INF){
cout << "-1\n";
return 0;
}
cout << DP[tot].first << '\n';
int curr = tot;
for(int i=1;i<=DP[tot].first;i++){
int nxt = DP[curr].second;
cout << curr-nxt << ' ';
for(int j=curr;j>nxt;j--){
cout << cookies[j] << ' ';
}
cout << '\n';
curr = nxt;
}
assert(curr==0);
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |