#include #define MAXPUMP 100 struct PUMPA { double c; int a; } pumpa[MAXPUMP]; int N, D, K; int velh, halda[MAXPUMP]; void insert(int p) // Vložení prvku do haldy { int i; halda[velh]=p;i=velh++; while (i && pumpa[halda[(i+1)/2]].c > pumpa[halda[i]].c ) { p=halda[i];halda[i]=halda[(i+1)/2];halda[(i+1)/2]=p;i=(i+1)/2; } } void extractmin(void) // Vyjmutí prvku s minimální cenou { int i,j,p; if (velh==0) return; halda[0]=halda[--velh];i=0; while ( i*2+1 < velh ) { if (i*2+2 < velh && pumpa[halda[i*2+1]].c > pumpa[halda[i*2+2]].c ) j=i*2+2; else j=i*2+1; if (pumpa[halda[i]].c <= pumpa[halda[j]].c) break; p=halda[i];halda[i]=halda[j];halda[j]=p;i=j; } } int cmp(const void *e1, const void *e2) // Pomocna proc. pro qsort { return ((struct PUMPA *)e1)->a - ((struct PUMPA *)e2)->a; } int main(void) { int i,j,t,vloz,dotank; // Načtení a inicializace údajů scanf("%d%d%d",&N,&D,&K); for(i=1;i<=N;i++) scanf("%d%lf",&pumpa[i].a,&pumpa[i].c); pumpa[0].c=0;pumpa[0].a=0;velh=0;t=0;vloz=0; // Pumpy si setřídíme podle rostoucí vzdálenosti od startu qsort(pumpa,N+1,sizeof(struct PUMPA),cmp); for(i=0;i<=N;i++) { // Spotřebujeme naftu za přejezd z i-1 té na i tou pumpu if (i) t-=pumpa[i].a-pumpa[i-1].a; // Vložíme do haldy pumpy v dojezdu for(;vloz<=N && pumpa[vloz].a-pumpa[i].a<=K ;vloz++) insert(vloz); // Odstraníme ty s minimální cenou, které jsme už přejeli while ( velh>0 && pumpa[halda[0]].a <= pumpa[i].a ) extractmin(); if (!velh && ipumpa[halda[0]].a-pumpa[i].a) dotank=0; else dotank=pumpa[halda[0]].a-pumpa[i].a-t; } else // Případ b) { if (pumpa[i].a+K>D) dotank=D-pumpa[i].a-t; else dotank=K-t; } if (dotank>0) printf("Na pumpe na %d km bereme %d nafty.\n",pumpa[i].a,dotank); t+=dotank; } return 0; }