Pagini recente » Cod sursa (job #2072084) | Cod sursa (job #2827318) | Cod sursa (job #1703250) | Cod sursa (job #2193356) | Cod sursa (job #528534)
Cod sursa(job #528534)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <deque>
using namespace std;
#define maxn 20010
#define maxg 75010
#define inf 999999999
#define pii pair<int, int>
#define pb push_back
#define mkp make_pair
int N, G, gmax, nmin;
int nr[210];
int A[2][maxg];
deque<pii> deq;
void solve() {
int i, j, p, q, add;
for(i=1; i<=G; i++) {
A[0][i] = inf;
}
for(i=1; i<=200; i++) {
if(!nr[i]) continue;
//folosesc greutatile i
for(j=1; j<=G; j++) {
A[1][j] = inf;
}
for(j=0; j<i; j++) {
//(j, j + i, j + 2*i, ..., j + nr[i]*i)
deq.clear(); add = 0;
deq.pb( mkp(j, 0) );
for(p=j; p<=G; p+=i) {
//elimin din deque elementele necorespunzatoare
int tm = (p - j) / i;
while(deq.size() && deq.front().second < tm - nr[i]) {
deq.pop_front();
}
//aflu A[1][p]
A[1][p] = A[0][ deq.front().first ] - deq.front().second + tm;
//adaug A[0][p + i] in deq
add ++;
while(deq.size() && A[0][ deq.back().first ] - deq.back().second >= A[0][p + i] - add) {
deq.pop_back();
}
deq.pb( mkp(p + i, tm + 1) );
}
}
for(j=1; j<=G; j++) {
A[0][j] = A[1][j];
}
}
}
int main() {
FILE *f1=fopen("ghiozdan.in", "r"), *f2=fopen("ghiozdan.out", "w");
int i, p;
fscanf(f1, "%d %d\n", &N, &G);
for(i=1; i<=N; i++) {
fscanf(f1, "%d\n", &p);
nr[p] ++;
}
solve();
for(i=G; i>=1; i--) {
if(A[0][i] < inf) {
gmax = i; nmin = A[0][i];
break;
}
}
fprintf(f2, "%d %d\n", gmax, nmin);
fclose(f1); fclose(f2);
return 0;
}