Pagini recente » Solutii preONI 2007, Runda 1 | Cod sursa (job #2902456) | Cod sursa (job #201059) | Autentificare | Cod sursa (job #48872)
Cod sursa(job #48872)
#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;
s=0;
for(x=s;((x<=gmax)&&(x<=g-G[i]+1));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=s;((x<=gmax)&&(x<=g-G[i]+1));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;
};