Cod sursa(job #1773513)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 7 octombrie 2016 21:56:54
Problema Ghiozdan Scor 54
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define INF 2140000000
#define MaxG 75005
#define MaxN 20005
#define MAX 131072
using namespace std;
  
FILE *IN,*OUT;
int pos=0,out=0,sign,N,G,v[MaxN],L[MaxG],Max=0;
bool d[MaxG];
char f[MAX],Out[MAX],str[10];

inline void Write_Ch(char ch)
{
    Out[out++]=ch;
    if(out==MAX)
        fwrite(Out,MAX,1,OUT),out=0;
}
inline void Write_Int(int nr)
{
    int x=0;
    if(nr<0)Write_Ch('-'),nr=-nr;
    do
    {
        str[x++]=nr%10+'0';
        nr/=10;
    }
    while(nr);
    while(x>0)
        Write_Ch(str[--x]);
}
inline int min2(int a,int b)
{
    if (a<b) return a;
    else return b;
}
inline int max2(int a,int b)
{
    if (a>b) return a;
    else return b;
}
inline void Read(int &nr)
{
    sign=0;
    nr=0;
    while(f[pos]<'0'||f[pos]>'9')
    {
        if(f[pos]=='-')sign=1;
        pos++;
        if(pos==MAX)
            fread(f,MAX,1,IN),pos=0;
    }
    while(f[pos]>='0'&&f[pos]<='9')
    {
        nr=10*nr+f[pos++]-'0';
        if(pos==MAX)
            fread(f,MAX,1,IN),pos=0;
    }
    if(sign)nr=-nr;
}

int main()
{
    IN=fopen("ghiozdan.in","r");
    OUT=fopen("ghiozdan.out","w");
    fread(f,1,MAX,IN);
	Read(N),Read(G);
	L[0]=0,d[0]=1;
	for(int i=1;i<=N;i++)
	{
		Read(v[i]);
		for(int j=G-v[i];j>=0;j--)
			if(d[j]&&(!d[j+v[i]]||(L[j]+1<L[j+v[i]])))d[j+v[i]]=true,L[j+v[i]]=L[j]+1,Max=max2(Max,j+v[i]);
	}
	Write_Int(Max),Write_Ch(' ');
	Write_Int(L[Max]),Write_Ch('\n');
	sort(v+1,v+1+N);
	for(int i=N;i>0&&Max>0;i--)
	{
		if(d[Max-v[i]])
			Write_Int(v[i]),Write_Ch('\n'),Max-=v[i];;
	}
    if(out>0)fwrite(Out,1,out,OUT);
    return 0;
}