Cod sursa(job #48855)

Utilizator the_andyAndrei Stefan the_andy Data 5 aprilie 2007 09:48:44
Problema Ghiozdan Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
#include<stdio.h>
#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

inline bool invcmp(long int a,long int b)
{
return (a>b);
}

int main(void)
{
int n;
long int g;
vector<long int> G;
vector<int> S1;
vector<int> S2;
vector<int> T;
long * time=(long*) 0x46c;
long *t;
long int x;
int i;
long int gmax;
long int gmax1;
long int s;
FILE *f;

//citeste datele de intrare
f=fopen("ghiozdan.in","rt");
fscanf(f,"%d %ld",&n,&g);
for(i=0;i<n;i++)
  {
  fscanf(f,"%ld",&x);
  G.push_back(x);
  }
fclose(f);

//sorteaza invers
sort(G.begin(),G.end(),invcmp);

//face vectorii
for(i=0;i<=g;i++)
  {
  S1.push_back(0);
  S2.push_back(0);
  T.push_back(-1);
  }

S1[0]=0;
gmax=0;
T[0]=-1;
for(i=0;((i<n)&&(S1[g]==0));i++) //pt fiecare obiect
  {
  gmax1=gmax;
  for(x=0;((x<=gmax)&&(x<=g));x++)
    if((S1[x]!=0)||(x==0)) //daca s-a obtinut deja greutatea x atunci
    //se poate obtine si x+G[i]
      {
      if((S1[x]+1<S1[x+G[i]])||(S1[x+G[i]]==0)) //daca x+G[i] se obtine intro varianta
      //mai buna atunci memoreaza atlfel nu are rost sau daca nu s-a obitnut deloc
        if((S1[x]+1<S2[x+G[i]])||(S2[x+G[i]]==0))                                               
          {
          S2[x+G[i]]=S1[x]+1;
          T[x+G[i]]=G[i];
          }
      if(x+G[i]>gmax1)
        gmax1=x+G[i];
      }
  //afiseaza
//  cout<<endl;
//  for(x=0;x<=gmax;x++)
//    cout<<S1[x]<<" ";
//  cout<<endl;
//  for(x=0;x<=gmax;x++)
//    cout<<S2[x]<<" ";
//  cout<<endl;
//  for(x=0;x<=gmax;x++)
//    cout<<T[x]<<" ";
//  cin>>x;
  
  gmax=gmax1;

  //copiaza vectorii
  for(x=0;((x<=gmax)&&(x<=g));x++)
    if(((S1[x]>S2[x])||(S1[x]==0))&&(S2[x]!=0))  
      {
      S1[x]=S2[x];
      S2[x]=0;
      }
  
  }

//afiseaza solutia
x=g;
while(S1[x]==0)
  {
  x-=1;
  }

//scrie
f=fopen("ghiozdan.out","wt");
fprintf(f,"%ld %d\n",x,S1[x]);
  s=x;
  while(s>0)
    {
    fprintf(f,"%ld\n",T[s]);
    s-=T[s];
    }
fclose(f);


//sf
return 0;
};