Pagini recente » Cod sursa (job #2533264) | Cod sursa (job #2584206) | Cod sursa (job #2948266) | Cod sursa (job #3124276) | Cod sursa (job #3133152)
#include <bits/stdc++.h>
#define debug(x) cerr << #x << " " << x << "\n"
#define debugs(x) cerr << #x << " " << x << " "
using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <long double, pii> muchie;
const ll NMAX = 201;
const ll VMAX = 1001;
const ll INF = (1LL << 60);
const ll MOD = 1000000007;
const ll BLOCK = 447;
const ll base = 31;
const ll nr_of_bits = 21;
int f[NMAX];
deque <pii> dq[201];
int dp[NMAX][1025];
pii last[NMAX][1025];
vector <int> sol;
int main() {
ifstream cin("ghiozdan.in");
ofstream cout("ghiozdan.out");
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, g, i;
cin >> n >> g;
for(i = 1; i <= n; i++) {
int x;
cin >> x;
f[x]++;
}
int sum = 0;
while(g > 1000){
for(int i = 200; i >= 1; i--){
if(!f[i])
continue;
while(g > 1000 && f[i]){
g -= i;
sum += i;
sol.push_back(i);
f[i]--;
}
}
}
for(int i = 0; i < NMAX; i++){
for(int j = 1; j <= g; j++)
dp[i][j] = 1e9;
}
for(int i = 1; i < NMAX; i++) {
for(int j = 0; j <= g; j++)
dp[i][j] = dp[i - 1][j];
if(!f[i])
continue;
for(int j = 0; j < i; j++)
dq[j].clear();
int cate = f[i];
for(int j = 0; j <= g; j++) {
int rest = j % i;
while(dq[rest].size() && dq[rest].back().first >= dp[i - 1][j])
dq[rest].pop_back();
dq[rest].push_back({dp[i - 1][j], j});
while(dq[rest].size() && (j - dq[rest].front().second) > cate * i)
dq[rest].pop_front();
int cine = dq[rest].front().second;
int cat = dq[rest].front().first;
if(cat + (j - cine) / i < dp[i][j]) {
dp[i][j] = cat + (j - cine) / i;
last[i][j] = {i, (j - cine) / i};
}
}
}
for(; g >= 0; g--) {
if(dp[NMAX - 1][g] != 1e9)
break;
}
int ind = NMAX - 1;
int ini = g;
while(g > 0) {
pii x = last[ind][g];
ind--;
while(x.second--) {
sol.push_back(x.first);
g -= x.first;
}
}
g = ini;
cout << g + sum << " " << sol.size() << "\n";
for(auto x : sol) cout << x << "\n";
r