Pagini recente » Cod sursa (job #2860902) | Cod sursa (job #1506274) | Cod sursa (job #3194970) | Cod sursa (job #1178380) | Cod sursa (job #252477)
Cod sursa(job #252477)
Utilizator |
Liviu Ciortea efer |
Data |
4 februarie 2009 15:00:26 |
Problema |
Caramizi |
Scor |
Ascuns |
Compilator |
cpp |
Status |
done |
Runda |
|
Marime |
1.23 kb |
#include <cstdio>
#include <cassert>
#include <algorithm>
using namespace std;
const int MAX_N = 200001;
const int MAX_M = 200001;
const int MAX_H = 1000001;
const int MAX_L = 2000000001;
typedef long long LL;
int N, M, C[MAX_N], L[MAX_M];
LL bst[MAX_H], res[MAX_M];
void read_data() {
FILE* fin = fopen("caramizi.in", "rt");
fscanf(fin, "%d %d", &N, &M);
assert(1 <= N && N < MAX_N);
assert(1 <= M && M < MAX_M);
for (int i = 0; i < N; ++i) {
fscanf(fin, "%d", &C[i]);
assert(1 <= C[i] && C[i] < MAX_H);
}
for (int i = 0; i < M; ++i) {
fscanf(fin, "%d", &L[i]);
assert(1 <= L[i] && L[i] < MAX_L);
}
fclose(fin);
}
void solve() {
sort(C, C+N);
int sum = 0;
for (int n = 1; n < MAX_H; ++n) {
int left = 0, now = 0;
for (int i = 0; i < N; ++i) {
if (C[i] < n) left += C[i];
else now++;
}
left /= n;
bst[n] = (now + left) * n;
bst[n] = max(bst[n], bst[n-1]);
}
for (int i = 0; i < M; ++i) {
res[i] = bst[L[i]];
}
}
void write_results() {
FILE* fout = fopen("caramizi.out", "wt");
for (int i = 0; i < M; ++i) {
fprintf(fout, "%lld\n", res[i]);
}
fclose(fout);
}
int main() {
read_data();
solve();
write_results();
return 0;
}