Cod sursa(job #253905)

Utilizator silvia_the_bestSilvia Pripoae silvia_the_best Data 6 februarie 2009 13:33:18
Problema Caramizi Scor 5
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 1 Marime 1.68 kb
#include <cstdio>
#include <cstdlib>
#define FIN "caramizi.in"
#define FOUT "caramizi.out"
#define N 200005
int v[N],n,m,rez,sum[N];
int comp(const void* a, const void * b)
{
    int aa,bb;
    aa = *(int*)a;
    bb = *(int*)b;
    return aa > bb ? aa : bb;    
}
void read()
{
     int i;
     freopen(FIN, "r", stdin); 
     freopen(FOUT, "w", stdout);       
     scanf("%d%d", &n, &m);
     for (i = 1; i <= n; ++i)
     {
         scanf("%d", &v[i]);
         sum[i] = sum[i-1] + v[i];
     }
     qsort(v+1,n,sizeof (v[1]),comp);
}
/*int cautbin (int x)
{
    int p = 1, u = n, mm; 
    while (p+1<u)
    {
          mm = (p + u)/2;
          if ( v[mm] > x) 
             u = mm-1;
          else
              p = mm;     
    }   
    if ( v[p-1] > x)
       --p;
    if ( v[p] < x )
       ++p;
    if ( p == n )
        return sum[n] / x;
    if ( v[p] >= x)
        return (n - p + 1) + (sum[p-1] / x);
    return sum[p] / x;
}*/
void solve()
{
    int i,j,p,u;
    for (i = 1; i <= m; ++i)
     {
        scanf("%d", &u);
        rez = 0; j = 1;  
        for (j = 1; j <= n && v[j] <= u; ++j)
        {
              p = v[j] * (n-j+1 + sum[j-1] / v[j]);
              if (p > rez)
                 rez = p; 
        }
        if (j <= n )
           if ((n - j + 1 + sum[j-1] / u) * u > rez)
              rez = (n - j + 1 + sum[j-1] / u) * u; 
        for (j = v[n] + 1; j <= sum[n]&& j <= u; ++j)
        {
            p = j * (sum[n] / j);
            if (p > rez)
                 rez = p;     
        }
        printf("%d\n", rez);
     }
     //printf("\n");
}

int main()
{
    read();
    solve();
    //write();
}