Cod sursa(job #2273828)

Utilizator pitradaPit-Rada Ionel-Vasile pitrada Data 31 octombrie 2018 23:51:11
Problema Ghiozdan Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.49 kb
///varianta standard, O(n*gmax)
#include<fstream>
#include <algorithm>
using namespace std;

fstream fin,fout;

int n,m,gmax, best[75005],prec[75005],g[202],i,j,pmax,x,xmax,k;
struct pereche{
    int g,v;
}a[20002];
bool comp(pereche a, pereche b){
    if(a.g>b.g ||(a.g==b.g && a.v<b.v))return 1;
    return 0;
}
int infinit=30000;

int main(){

	fin.open("ghiozdan.in",ios::in);

	fout.open("ghiozdan.out",ios::out);

	fin>>n>>gmax;

	for(i=1;i<=n;i++){

        fin>>x; xmax=max(xmax,x);

        g[x]++;

	}
	m=0;
	for(i=xmax;i>=1;i--){
        if(g[i]){
            j=1;
            while(j*2<=g[i]){
                j=j*2;
            }
            if(j<g[i]){
                m++;
                a[m]={(g[i]-j)*i,g[i]-j};
            }
            while(j){
                m++;
                a[m]={j*i,j};
                j=j/2;
            }
        }
	}
    sort(a+1,a+m+1,comp);
	for(i=1;i<=gmax;i++){

		best[i]=infinit;

	}

	best[0]=0; pmax=0;

    for(i=1;i<=m;i++){

        for(k=gmax;k>=a[i].g;k--){

            if(best[k-a[i].g]+a[i].v<best[k]){
                best[k]=best[k-a[i].g]+a[i].v;
                prec[k]=k-a[i].g;
            }
        }
    }
    for(i=gmax;i>=0;i--){
        if(best[i]<infinit){
            pmax=i;
            break;
        }
    }
	fout<<pmax<<" "<<best[pmax]<<"\n";

	for(i=pmax;i!=0;i=prec[i]){

        fout<<i-prec[i]<<"\n";

	}

	fout.close();

	fin.close();

	return 0;

}