Cod sursa(job #436197)

Utilizator write2cristiGal Cristian write2cristi Data 8 aprilie 2010 12:14:12
Problema Gutui Scor 100
Compilator cpp Status done
Runda teme_upb Marime 2.87 kb
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
typedef struct gutui{
        unsigned greutate;
        unsigned inaltime;
        }gutui;
gutui *v;
char ok=0;
unsigned nr_gutui,inalt_max,pas_inalt;

void citire(){//citeste datele din fisier si le introduce in structura de tip gutui v
     
     FILE *f=fopen("gutui.in","r");
     fscanf(f,"%u %u %u",&nr_gutui,&inalt_max,&pas_inalt);
     v=(gutui*)malloc(sizeof(gutui)*nr_gutui);
     for(unsigned i=0;i<nr_gutui;i++)
     {
                  fscanf(f,"%u %u",&v[i].inaltime,&v[i].greutate);
                  if(v[i].inaltime>inalt_max)//daca are inaltimea mai mare decat 
                                                    //cea maxima atunci nu se pune in structura
                               {
                                        i--;
                                        nr_gutui--;
                                        continue;
                               }
                  if(v[i].inaltime%pas_inalt > inalt_max%pas_inalt)
                                             v[i].inaltime=v[i].inaltime/pas_inalt+1;
                  else
                                             v[i].inaltime=v[i].inaltime/pas_inalt;
                  
     }
     v=(gutui*)realloc(v,sizeof(gutui)*nr_gutui);//daca este o gutuie la o inaltime mai mare decat 
                                                        //cea maxima trebuie schimbata dimensiunea lui v
    inalt_max/=pas_inalt;          
    fclose(f);
}

void afis(){
     for(unsigned i=0;i<nr_gutui;i++)
     {     
                          printf("%u %u\n",v[i].greutate,v[i].inaltime);
                         
     }
     system("pause");
}

int compare (const void * a, const void * b)
{
  return  -( (*(gutui*)a).greutate - (*(gutui*)b).greutate );
}


void sortare(){//sorteaza in functie de greutate
     qsort (v, nr_gutui, sizeof(gutui), compare);
}

int funct(char *vec,unsigned i, unsigned ind)//functie care primeste o gutuie si daca poate fi luata
                                                   // de Gigel returneaza valoarea greutatii si 0 daca nu
{
    for(;i<inalt_max+1;i++)
            if(vec[i]==0)
            {
                       vec[i]=1;
                       return v[ind].greutate;
            }           
    return 0;
}

int rezolvare(){//parcurge o singura data datele citite si returneaza suma greutatilor gutuilor citite
    char *vec=(char*)calloc(inalt_max+1,1);
    if(nr_gutui==0)
                   return 0;
    unsigned s=0;
    for(unsigned i=0;i<nr_gutui;i++)
                 s+=funct(vec, v[i].inaltime,i);
    return s;
}
void scriere(unsigned s){
    FILE *g=fopen("gutui.out","w");
    fprintf(g,"%u",s);
    fclose(g);
}     

                     
int main(){
    citire();  
    sortare();
    scriere(rezolvare());
    return 0;
}