Submission #1029743

#TimeUsernameProblemLanguageResultExecution timeMemory
1029743UnforgettableplCookies (JOI23_cookies)C++17
6 / 100
2 ms1112 KiB
#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 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...