Cod sursa(job #464660)

Utilizator Marius96Marius Gavrilescu Marius96 Data 21 iunie 2010 12:44:18
Problema Caramizi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
/* 
 * File:   Caramizi.cpp
 * Author: marius
 *
 * Created on June 21, 2010, 9:24 AM
 */
#include <cstdio>
using namespace std;
#include <list>
list<int> v;
list<int> t;
unsigned int r[200005];
int main(int argc, char** argv) {
    freopen("caramizi.in","r",stdin);
    freopen("caramizi.out","w",stdout);
    int n,m,x;
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++){
        scanf("%d",&x);
        v.push_back(x);
    }
    v.sort();
    int val;
    list<int>::iterator it,it2;
    for(int l=1;l<=n;l++){
        t=list<int>(v);
        while(t.size()>=l){
            it=t.begin();
            for(int i=0;i<t.size()-l;i++)
                it++;
            val=*it;
            r[l]+=val;
            if(t.size()==l)
                break;
            it=t.erase(it);
            it2=t.begin();
            for(;it!=t.end();it=t.erase(it)){
                x=*it-val;
                while(*it2<x)
                    it2++;
                t.insert(it2,x);
            }
        }
    }
    unsigned long long max=0;
    for(;m;m--){
        scanf("%d",&x);
        unsigned long long i;
        for(i=n;i>=0;i--)
            if(r[i]>x)
                break;
            else if(max<r[i]*i)
                max=r[i]*i;
        if(max<x*i)
            max=x*i;
        printf("%llu\n",max);
    }
    return 0;
}