#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MIN_N 1 // minimum pályázat
#define MAX_N 100 // maximum pályázat
#define MIN_M 1 // minimum parcella
#define MAX_M 100 // maximun parcella
#define MIN_AR 1000 // minimum ár
#define MAX_AR 1000000 // maximum ár
struct p_ // A pályázat struktúrája
{
int n,m; // 'n' a pályázatok szána, 'm' parcellák száma
int par_e[MAX_N-1]; // első parcella
int par_u[MAX_N-1]; // utolsó száma
float p_ert[MAX_N-1]; // pályázat értéke
char p_flag[MAX_N-1]; // hiba jelző
};
void hiba(const char *h_leir, char flag) // hibaüzenet ki
// h_leir = hibaüzenet szövege
// ha flag = 1 akkor kilép
// ha flag = 0 akkor visszatér
{
if (flag==0)
{
fprintf(stderr,h_leir);
return;
}
if (flag==1)
{
fprintf(stderr,"Végzetes hiba :\n%s\nKilépés a programbol ...\n",h_leir);
exit (1);
}
}
#define BUFF_SIZE 256 // puffer mérete
struct p_ beolvas()
{
FILE *f;
int x=0,c=0,flag=0;
char buff[BUFF_SIZE];
struct p_ p;
f = fopen("licit.be","r");
if (f==NULL) hiba("Nem lehet megnyitni a 'licit.be' file -t !\n",1);
flag=fscanf(f,"%d %d",&p.n,&p.m);
if (flag==EOF)
{
fclose(f);
hiba("A 'licit.be' file hibás (kevés adat) !\n",1);
}
if (flag!=2)
{
fclose(f);
hiba("A 'licit.be' file hibás (első sor) !\nFormátum : x y\nx = pályázatok száma\ny = parcellák száma\n",1);
}
if (p.n<MIN_N || p.n>MAX_N || p.m<MIN_M || p.m>MAX_M)
{
fclose(f);
sprintf(buff,"A 'licit.be' file hibás (első sor) !\nFormátum : x y\nx = pályázatok száma (%d-%d)\ny = parcellák száma (%d-%d)\n",MIN_N,MAX_N,MIN_M,MAX_M);
hiba(buff,1);
}
do
{
flag=fscanf(f,"%d %d %f",&p.par_e[x],&p.par_u[x],&p.p_ert[x]);
if (flag!=EOF)
{
p.p_flag[x]=0;
if (flag!=3)
{
fclose(f);
sprintf(buff,"A 'licit.be' file hibás (%d. sor) !\nFormátum : x y z\nx = parc.-tól\ny = parc.-ig\n z = ennyiért\n",x+1);
hiba(buff,1);
}
if (p.par_u[x]<p.par_e[x])
{
sprintf(buff,"A 'licit.be' file hibás (%d. sor) !\nFormátum : x y z\nx = parc.-tól\ny = parc.-ig\n z = ennyiért\n",x+1);
hiba(buff,0);
hiba("x <= y\nFeltételezem hogy véletlen elírá, ezért kicserélem a két operandust.\n",0);
c=p.par_u[x]; p.par_u[x]=p.par_e[x]; p.par_e[x]=c;
}
if (p.p_ert[x]<MIN_AR || p.p_ert[x]>MAX_AR)
{
sprintf(buff,"A 'licit.be' file hibás (%d. sor) !\nFormátum : x y z\nx = parc.-tól\ny = parc.-ig\n z = ennyiért\n",x+1);
hiba(buff,0);
sprintf(buff,"Az ár értékhatáron kívül esik (%d - %d) !\nÉrvénytelen pályázat.",MIN_AR,MAX_AR);
hiba(buff,0);
p.p_flag[x]=1;
}
x++;
}
}while(flag!=EOF);
fclose(f);
if (x!=p.n)
hiba("A licit.be fileban megadott pályázatok száma nem egyezik az adatsorok számával.\n",1);
return (p);
}
struct ljp // a legjobb pályázat struktúrája
{
int psz; // pályázatok száma
char pl[MAX_N]; // pályázatok listálya
float ert;
};
void kiir(struct ljp legj,char flag)
{
FILE *f;
int x=0;
if (flag==1) f=fopen("licit.ki","a");
else f=fopen("licit.ki","w");
if(f==EOF) hiba("nem lehet mergnyitni a 'licit.ki' file -t !",1);
fprintf(f,"%f\n",legj.ert);
do
{
fprintf(f,"%d ",legj.pl[x]+1);
x++;
}while (x<legj.psz);
fprintf(f,"\n");
fclose(f);
}
void main ()
{
struct p_ p; // a pályázat változója
int x=0,y=0,vx,vy;
struct ljp legj;
struct ljp akt;
p = beolvas();
fopen("licit.ki","w");
fcloseall();
legj.psz=1;
legj.pl[0]=0;
legj.ert=p.p_ert[0];
akt.ert=0;
if (p.n==1) { kiir(legj,0); exit; }
do
{
y=x+1; akt.ert=p.p_ert[x]; akt.psz=1; akt.pl[akt.psz-1]=y-1;
do
{
if (p.par_e[x]<=p.par_e[y]) { vx=x; vy=y; }
else { vx=y; vy=x; }
if (p.par_e[vx]==p.par_e[vy] || p.par_u[vx]>=p.par_e[vy])
{
y++;
}
else { akt.pl[akt.psz]=y; akt.ert=akt.ert+p.p_ert[y]; akt.psz++; y++; }
}while (y<p.n);
if (akt.ert>=legj.ert)
{
if (akt.ert==legj.ert) kiir(legj,1); // ha több egyforma értékü variáció is van
legj.ert=akt.ert;
legj.psz=akt.psz;
memcpy(legj.pl,akt.pl,legj.psz*sizeof(char));
}
x++;
}while(x<p.n-1);
kiir(legj,0);
return;
}