Cod sursa(job #1201767)

Utilizator enedumitruene dumitru enedumitru Data 25 iunie 2014 23:03:13
Problema Caramizi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <cstdio>
#include<algorithm>
#define DIM 8192 
using namespace std;
int n,m,pz,i,c,cmax;
long long s,A[1000005],Nr[1000005],R[1000005],D[1000005],H[200005];
char ax[DIM+16];     
inline void cit(int &x)
{   x=0;
    while(ax[pz]<'0' || ax[pz]>'9')
        if(++pz==DIM) fread(ax,1,DIM,stdin), pz=0;
    while(ax[pz]>='0' && ax[pz]<='9')
    {   x=x*10+ax[pz]-'0';
        if(++pz==DIM) fread(ax,1, DIM, stdin), pz=0;
    }
}
int main()
{   freopen  ("caramizi.in","r",stdin); freopen ("caramizi.out","w",stdout);
	cit(n); cit(m);
    for(i=1;i<=n;++i) cit(c), ++A[c], cmax=max(cmax,c), s+=c;
    for(i=1;i<=cmax;++i) R[i]=R[i-1]+i*A[i];
    for(i=cmax;i;--i) Nr[i]=Nr[i+1]+A[i];
	for(i=1;i<=cmax;++i) D[i]=max(D[i-1],R[i]/i*i+Nr[i+1]*i);
    H[s/cmax+1]=D[cmax];
    for(i=s/cmax;i;--i) H[i]=max(H[i+1],s/i*i);
    for(i=1;i<=m;++i)
    {   cit(c);
        if(c<=cmax) printf("%lld\n",D[c]); else printf("%lld\n",max(s/c*c,H[s/c+1]));
    }
    return 0;
}