Cod sursa(job #436989)

Utilizator andra_serbanSerban Andra-Elena andra_serban Data 9 aprilie 2010 02:40:16
Problema Gutui Scor 0
Compilator c Status done
Runda teme_upb Marime 3.1 kb
#include<stdio.h>
#include<stdlib.h>
#include<limits.h>


int n;
int N;
int H;
int U;

typedef struct Gutui {
        int lvl;
        int nr;
        int inaltime;
        int greutate;
} Gutui;

struct Gutui g[100001];

void write(int x) {

    FILE * g = fopen("gutui.out", "w");

    fprintf(g, "%d", x);

}

void sort() {

    int i, j, aux, aux2;

    for (i = 1; i <= N - 1; i++)
        for (j = i + 1; j <= N; j++)
            if (g[i].lvl > g[j].lvl) {
                aux = g[i].greutate;
                g[i].greutate = g[j].greutate;
                g[j].greutate = aux;
                aux = g[i].inaltime;
                g[i].inaltime = g[j].inaltime;
                g[j].inaltime = aux;
                aux = g[i].lvl;
                g[i].lvl = g[j].lvl;
                g[j].lvl = aux;
            }

}


void gutui() {

    int i, j, k, aux, count;
    int r, rest, suma, level;
    
    if(( rest = H % U ) == 0)  r = U;
    else                       r = rest; 
    k = 0;
    for( i = 1; i <= N; i ++ ) {         
         for( j = 1; j <= r; j ++)  {
              if((g[i].inaltime <= (H - (j - 1) * U)) && (g[i].inaltime >= ( H - j * U + 1))) 
                  g[i].lvl = j;
         }

    }

    sort();

    
    level = g[1].lvl - 1;     
    if( level != 1 ) 
        for( i = 1; i <= N; i ++ )         
             g[i].lvl = g[i].lvl - level;


    g[N].nr = 1;
    for (i = N - 1; i >= 1; i --)
        if( g[i+1].lvl == g[i].lvl )
            g[i].nr = g[i + 1].nr + 1;
        else
            g[i].nr = 1;


    for (i = 1; i <= N - 1; i++)
        for (j = i + 1; j <= N; j++)
            if (g[i].lvl == g[j].lvl && g[i].greutate < g[j].greutate) {
                aux = g[i].lvl;
                g[i].lvl = g[j].lvl;
                g[j].lvl = aux;
                aux = g[i].greutate;
                g[i].greutate = g[j].greutate;
                g[j].greutate = aux;
                aux = g[i].inaltime;
                g[i].inaltime = g[j].inaltime;
                g[j].inaltime = aux;
            }
     
     k = 1;
     count = 0;
     suma = 0;
     
     while( k <= N ) { 
            if( g[k].lvl > count ) 
                if( g[k].greutate >= g[k + g[k].nr + g[k + 1].nr - 1 ].greutate ) {    
                    suma = suma + g[k].greutate;
                    k = k + 1;
                    count = count + 1;
                }
                else
                    k = k + g[k].nr;  
            else 
                 k = k + g[k].nr;
     } 

    for (i = 1; i <= N; i++) {
        printf("%d ", g[i].lvl);
        printf("%d ", g[i].nr);
        printf("%d ", g[i].inaltime);
        printf("%d", g[i].greutate);
        printf("\n");
    }
     write(suma);
}


int main() {
 
    FILE * f = fopen("gutui.in", "r");
    int i;

    fscanf(f, "%d", &N);
    fscanf(f, "%d", &H);
    fscanf(f, "%d", &U);

    for (i = 1; i <= N; i++) {
        fscanf(f, "%d", &g[i].inaltime);
        fscanf(f, "%d", &g[i].greutate);
    } 
    
    gutui();
    
 
  return 0;
    
}