Pagini recente » Cod sursa (job #1949886) | Cod sursa (job #2496786) | Cod sursa (job #2069082) | Cod sursa (job #739500) | Cod sursa (job #435726)
Cod sursa(job #435726)
#include "stdio.h"
int h,u;
typedef struct {
int h,g;
int val;
} gutui;
int cmp(void* a, void* b)
{
int x = (((gutui*)b)->h)/u - (((gutui*)a)->h)/u;
return (x?x:(((gutui*)b)->g - ((gutui*)a)->g));
}
int cmp2(void* a, void* b)
{
int x = ((gutui*)b)->g - ((gutui*)a)->g;
//return (x?x:((gutui*)b)->val - ((gutui*)a)->val);
return x;
}
int main()
{
FILE *f, *g;
f = fopen("gutui.in", "r");
g = fopen("gutui.out", "w");
int n,i;
fscanf(f, "%i %i %i", &n,&h,&u);
gutui a[n];
gutui b[n];
for (i=0;i<n;i++)
{
fscanf(f, "%i %i", &a[i].h, &a[i].g);
a[i].val = 0;
}
qsort(a, n, sizeof(gutui), cmp);
unsigned int j=0, //numarul de gutui din grupul curent
k=1; //numarul grupului curent
int m=0;
i=0;
while(i<n)
{
if (a[i].h > h-k*u)
{
if (j>=0)
{
b[m] = a[i];
b[m].val = k-1;
m++,j--;
}
i++;
}
else
{
j=k++;
}
}
qsort(b, m, sizeof(gutui), cmp2);
for (j=0;j<m;j++)
printf("%i %i %i\n", b[j].h, b[j].g, b[j].val);
printf("\n");
int c[h/u+1];
for (j=0;j<=h/u;j++)
c[j]=0;
int tot=0;
int contor = 0;
int boo = 0;
for (j=0;j<m && contor<=h/u;j++)
{
k = 0;
boo = 1;
c[b[j].val]++;//vad daca gutuia curenta poate intra la solutie
for (i=0;i<=h/u;i++)
{
k+=c[i];
if (k>i+1) boo = 0;//verific daca dupa ce o adaug la solutie poate fi culeasa
}
if (boo)
{
tot+=b[j].g;
printf("%i %i %i\n", b[j].h, b[j].g, b[j].val);
contor++;
}
else
{
c[b[j].val]--;//daca nu
}
}
fprintf(g, "%i", tot);
printf("%i\n", tot);
close(f);
close(g);
return 0;
}