Cod sursa(job #254063)

Utilizator silvia_the_bestSilvia Pripoae silvia_the_best Data 6 februarie 2009 17:57:47
Problema Caramizi Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <cstdio>
#include <algorithm>
//#include <cstdlib>
#define FIN "caramizi.in"
#define FOUT "caramizi.out"
#define N 200005
using namespace std;
int v[N],n,m,rez,sum[N];
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];
	}
	sort(v,v+n);
}
/*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();
}