Cod sursa(job #2025952)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 23 septembrie 2017 14:40:28
Problema Caramizi Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <stdio.h>
#include <math.h>

#define MAXVAL 1000000

int f[1 + MAXVAL];
long long d[1 + MAXVAL];
long long e[1 + MAXVAL];
int main(){
    FILE*fi,*fo;
    fi = fopen("caramizi.in","r");
    fo = fopen("caramizi.out","w");

    int n, m;
    fscanf(fi,"%d%d", &n, &m);
    for(int i = 1; i <= n; i++){
        int x;
        fscanf(fi,"%d", &x);
        f[x] ++;
    }
    long long sum = 0;
    int spate = 0;
    int max = -1;
    for(int i = 1; i <= MAXVAL; i++){
        sum += 1LL * f[i] * i;
        if(f[i] > 0)
            max = i;
        spate += f[i];
        d[i] = d[i - 1];
        if(sum - sum % i + (n - spate) * i > d[i])
            d[i] = sum - sum % i + (n - spate) * i;
    }
    for(int i = sum / max; i >= 1; i--){
        e[i] = e[i + 1];
        if(sum - sum % i > e[i])
            e[i] = sum - sum % i;
    }



    for(int i = 1; i <= m; i++){
        int x;
        fscanf(fi,"%d", &x);
        if(x <= MAXVAL) fprintf(fo,"%lld\n", d[x]);
        else fprintf(fo,"%lld\n", e[sum / x + 1]);
    }

    fclose(fi);
    fclose(fo);
    return 0;
}