Cod sursa(job #253979)

Utilizator silvia_the_bestSilvia Pripoae silvia_the_best Data 6 februarie 2009 13:58:38
Problema Caramizi Scor 5
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 1 Marime 1.99 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,j2;
    for (i = 1; i <= m; ++i)
     {
        scanf("%d", &u);
        rez = 0; j = 1;  
        if (u < v[1])
           printf("%d\n",u*n);
        else
        {
            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; 
            }
            for (j2 = v[j - 1] ; j2 <= v[j]; ++j2)
            {
               p = j2 * (n-j+1 + sum[j-1] / j2);
               if (p > rez)
                  rez = p;  
            }
            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();
}