Pagini recente » Clasament asd | Cod sursa (job #2399099) | Cod sursa (job #512367) | Cod sursa (job #1052877) | Cod sursa (job #1827087)
#include <stdio.h>
#include <stdlib.h>
int v[5000][2];
void quickSort(int begin,int end) {
int aux,b=begin,e=end,pivot;
pivot=v[(begin+end)/2][0];
while(b<=e){
while(v[b][0]<pivot) b++;
while(v[e][0]>pivot) e--;
if(b<=e){
aux=v[b][0]; v[b][0]=v[e][0]; v[e][0]=aux;
aux=v[b][1]; v[b][1]=v[e][1]; v[e][1]=aux;
b++; e--;
}
}
if(begin<e) quickSort(begin,e);
if(b<end) quickSort(b,end);
}
int elimin(int* pozincep,int n,int val,int* scad){
int min=-1,i,j;
i=*pozincep;
while(v[i][0]==-1 && i<n)
i++;
if(i<n){
*scad=v[i][1];
min=v[i][0];
}
j=i;
while(*scad<val && j<n){
while(v[j][0]==-1 && j<n)
j++;
(*scad)+=v[j][1];
min+=v[j][0];
}
if(*scad>=val){
while(i<j && *scad>=val){
if(v[i][0]!=-1 && (*scad)-v[i][1]>=val){
scad-=v[i][1];
min-=v[i][0];
}
i++;
}
*pozincep=j+1;
while(i<=j){
v[i][0]=-1;
i++;
}
}
return min;
}
int gasireMax(int n,int g){
int greutate=0,val,min,i,nr=0,pozincep=0,pozincep2,scad;
i=0;
while(greutate<=g && i<n){
nr+=v[i][0];
greutate+=v[i][1];
i++;
}
if(greutate>g){
i--;
nr-=v[i][0];
greutate-=v[i][1];
}
while(i<n){
greutate+=v[i][1];
if(greutate>g){
val=greutate-g;
pozincep2=pozincep;
min=elimin(&pozincep2,n,val,&scad);
if(min<v[i][0]){
pozincep=pozincep2;
nr=nr+v[i][0]-min;
greutate-=scad;
}
else{
v[i][0]=-1;
greutate-=v[i][1];
}
}
i++;
}
return nr;
}
int main()
{
FILE*fin,*fout;
int n,g,i;
fin = fopen("rucsac.in" ,"r");
fout = fopen("rucsac.out" ,"w");
fscanf(fin, "%d%d" ,&n,&g);
for(i=0;i<n;i++)
fscanf(fin, "%d%d" ,&v[i][1],&v[i][0]);
quickSort(0,n-1);
/*for(i=1;i<=g;i++){
max=0;
for(j=0;j<n;j++){
if(v[j][0]<=i){
if(v[j][1]+v2[i-v[j][0]]>max){
max=v[j][1]+v2[i-v[j][0]];
}
}
}
v2[i]=max;
}*/
fprintf(fout, "%d\n" ,gasireMax(n,g));
fclose(fin);
fclose(fout);
return 0;
}