Pagini recente » Cod sursa (job #1202988) | Cod sursa (job #2526035) | Cod sursa (job #906799) | Cod sursa (job #2167306) | Cod sursa (job #436602)
Cod sursa(job #436602)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define DEBUG 0
typedef struct gutuie{
int greut;
int inalt;
int rez;
}gutuie;
struct node
{
int priority;
int info;
struct node *next;
}*start,*q,*temp,*new;
typedef struct node *N;
void insert(int itprio)
{
//int item,itprio;
new=(struct node *)malloc(sizeof(struct node));
//printf("ENTER THE ELT.TO BE INSERTED :\t");
//scanf("%d",&item);
//printf("ENTER ITS PRIORITY :\t");
//scanf("%d",&itprio);
//new->info=item;
new->priority=itprio;
if(start==NULL || itprio<start->priority)
{
new->next=start;
start=new;
}
else
{
q=start;
while(q->next != NULL && q->next->priority<=itprio)
q=q->next;
new->next=q->next;
q->next=new;
}
}
int peek()
{
if(start==NULL)
return 0;
else
return start->priority;
}
void del()
{
if(start==NULL)
{
printf("\nQUEUE UNDERFLOW\n");
}
else
{
new=start;
//printf("\nDELETED ITEM IS %d\n",new->info);
start=start->next;
free(start);
}
}
void swap (gutuie *a, gutuie *b)
{
gutuie c = *a;
*a = *b;
*b = c;
}
void qsort_r (gutuie* primul, gutuie* ultimul)
{
gutuie *mic = primul;
gutuie *mare = ultimul;
gutuie pivot = *(primul+(ultimul-primul)/2);
while (mic <= mare)
{
while ((*mic).rez < pivot.rez || ((*mic).rez == pivot.rez && (*mic).greut > pivot.greut) ) mic++;
while (pivot.rez < (*mare).rez || (pivot.rez == (*mare).rez && pivot.greut > (*mare).greut)) mare--;
if (mic < mare) swap (mic++, mare--);
else mic++;
}
if (primul < mare)
qsort_r (primul, mare);
if (mare < ultimul)
qsort_r (mare+1, ultimul);
}
int main()
{
FILE *input;
FILE *output;
int i,j,m,n;
int Nr,H,U;
int *inaltimi;
int *greutati;
int *rezista;
gutuie *vec;
int rezultat=0;
int remains;
int nr_gutui;
int diferenta,nivel,niv_curent,alesi_pe_nivel;
input = fopen("gutui.in","r");
fscanf(input,"%d %d %d",&Nr,&H,&U);
inaltimi = (int*)calloc(Nr,sizeof(int));
greutati = (int*)calloc(Nr,sizeof(int));
rezista = (int*)calloc(Nr,sizeof(int));
vec = (gutuie*)calloc(Nr,sizeof(gutuie));
for(i=0;i<Nr;i++){
fscanf(input,"%d %d",&(vec[i].inalt),&(vec[i].greut));
}
fclose(input);
for(i=0;i<Nr;i++)
vec[i].rez = (H-vec[i].inalt)/U+1;
qsort_r(vec,vec+Nr-1);
for(i=0;i<Nr;i++)
printf("%d %d %d\n", vec[i].greut,vec[i].rez,vec[i].inalt);
remains = 0;
nivel = vec[0].rez;
niv_curent = nivel;
printf("incep");
//inserez primele
for(i=0;i<nivel;i++)
insert(vec[i].greut);
diferenta =0;
alesi_pe_nivel = nivel;
for(i=nivel;i<Nr;i++){
if(vec[i].rez > nivel){
printf("schimb");
niv_curent = vec[i].rez;
diferenta = niv_curent - nivel;
nivel=niv_curent;
//aleg diferenta
insert(vec[i].greut);
diferenta -=1;
alesi_pe_nivel =1;
}else
{
if(diferenta>0){
insert(vec[i].greut);
diferenta -=1;
alesi_pe_nivel+=1;
}
else
{
if(alesi_pe_nivel < niv_curent){
if(peek() < vec[i].greut){
del();
insert(vec[i].greut);
alesi_pe_nivel+=1;
}
}
}
}
}
diferenta =0;
while(start != NULL)
{
diferenta += peek();
del();
}
/*
for(i=Nr-1;i>=0;i--)
if(vec[i].rez - remains > 0){
rezultat += vec[i].greut;
remains+=1;
printf("aleg: %d %d\n",vec[i].greut,vec[i].rez);
}
*/
printf("%d",diferenta);
return 0;
}