Cod sursa(job #841922)

Utilizator Xavierpana emil Xavier Data 25 decembrie 2012 15:54:13
Problema Energii Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include<stdio.h>
#include<stdlib.h>
#include<limits.h>

int cost = -1;

void sortByEfficiency (int** generatoare, int size)
{
    int i, j;
    
    for (i = 0; i < size-1; i++)
    {
        for (j = i+1; j < size; j++)
        {
            if (generatoare[i][0] * generatoare[j][1] < generatoare[i][1] * generatoare[j][0])
            {
                 int* aux;
                 aux = generatoare[i];
                 generatoare[i] = generatoare[j];
                 generatoare[j] = aux;
            }
        }
    }
}

void greedy (int** generatoare, int n, int energy)
{
    int i = 0, j = 0;
    int sum = energy;
    int cost1;
    
    while (i < n && sum >= energy)
    {
        j = i;
        
        sum = 0;
        cost1 = 0;
        while (sum < energy && j < n)
        {
            sum += generatoare[j][0];
            cost1 += generatoare[j][1];
            
            j++;
        }
        
        if ((cost1 < cost || cost == -1) && sum >= energy)
           cost = cost1;
        
        i++;
    }
}

int main()
{
    FILE *in;
    FILE *out;
    in = fopen("energii.in", "r");
    out = fopen("energii.out", "w");
    
    if (in != NULL && out != NULL)
    {
       int n;  //  nr generatoare
       int e;  //  energie minima pornire
       int i;
       int** generatoare;
       
       fscanf(in, "%d %d", &n, &e);
       
       generatoare = (int**) malloc(n * sizeof(int*));
       
       for (i = 0; i < n; i++)
       {
           generatoare[i] = (int*) malloc(2 * sizeof(int));
           
           fscanf(in, "%d %d", &generatoare[i][0], &generatoare[i][1]);
       }
       sortByEfficiency(generatoare, n);
       
       greedy(generatoare, n, e);
       
       fprintf(out, "%d", cost);
       
       fclose(in);
       fclose(out);
    }
    
    return 0;
}