Pagini recente » Cod sursa (job #73070) | Cod sursa (job #205382) | Cod sursa (job #188951) | Cod sursa (job #3243805) | Cod sursa (job #2058118)
#include <bits/stdc++.h>
using namespace std;
const int MAXG = 75e3;
const int MAXOBJ = 200;
const int INF = 0x7f7f7f7f;
deque <pair <int, int>> deq;
int dp[2][MAXG + 1], prv[2][MAXG + 1], freq[MAXOBJ + 1];
ofstream fout("ghiozdan.out");
void solve(int l, int r, int gr) {
if (gr == 0)
return;
if (l == r) {
for (int i = 0; i < freq[l] && i * l < gr; ++i)
fout << l << '\n';
return;
}
int mid = (l + r) / 2, ind = (l & 1);
memset(dp, INF, sizeof dp);
dp[1 - (l & 1)][0] = 0;
for (int i = l; i <= r; ++i, ind = 1 - ind)
if (freq[i]) {
for (int rest = 0; rest < i; ++rest) {
deq.clear();
for (int j = rest; j <= gr; j += i) {
int cost = dp[1 - ind][j] + j / i;
while (deq.empty() == false && deq.front().first < j - i * freq[i])
deq.pop_front();
while (deq.empty() == false && deq.back().second >= cost)
deq.pop_back();
deq.push_back({j, cost});
cost = deq.front().first;
dp[ind][j] = dp[1 - ind][cost] + (j - cost) / i;
prv[ind][j] = (i > mid) ? prv[1 - ind][cost] : j;
}
}
} else
ind = 1 - ind;
ind = 1 - ind;
int lstgr = gr;
while (lstgr >= 0 && dp[ind][lstgr] >= INF)
--lstgr;
if (l == 1 && r == MAXOBJ)
fout << lstgr << " " << dp[ind][lstgr] << '\n';
solve(l, mid, prv[ind][lstgr]);
solve(mid + 1, r, gr - prv[ind][lstgr]);
}
int main()
{
int n, g;
ifstream fin("ghiozdan.in");
fin >> n >> g;
for (int i = 0; i < n; ++i) {
int num;
fin >> num;
++freq[num];
}
fin.close();
solve(1, 200, g);
fout.close();
return 0;
}