Cod sursa(job #48837)

Utilizator the_andyAndrei Stefan the_andy Data 5 aprilie 2007 09:11:47
Problema Ghiozdan Scor 36
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 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;
long int x;
int i;
long int gmax;
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);
  }

S1[0]=0;
gmax=0;
for(i=0;i<n;i++) //pt fiecare obiect
  {
  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;
      if(x+G[i]>gmax)
        gmax=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]<<" ";
//  cin>>x;
  

  //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",x,S1[x]);
fclose(f);


//sf
return 0;
};