#include #include #include using namespace std; #define inf 1e20 #define eps 1e-8 enum state { roaming, waiting, carrying, ending, }; struct elev_t { int cap,stop,dest; double v; int carry; state status; double level; double next_time; } es[20]; int n,m; double d; int ns[40]; double fire[40]; int main() { while(scanf("%d%d",&n,&m)&&n|m) { memset(es,0,sizeof(es)); memset(ns,0,sizeof(ns)); scanf("%lf",&d); for (int i=0;ikk) fire[i]=tx+ty*(i-kk); else if (i=0;--i) if (ns[i]>0) { dest=i; break; } if (dest==-1) { for (int i=0;ies[i].level) es[i].level+=(double)(nt-t)*es[i].v/d; else es[i].level-=(double)(nt-t)*es[i].v/d; } } if (index>=m) { // printf("%.3lf: fire %d\n",nt,index-m); ns[index-m]=0; } else { if (es[index].status==waiting) { // printf("%.3lf: departure %d %d %d\n",nt,index,(int)(es[index].level+0.5),es[index].carry); if (es[index].carry==es[index].cap||dest==-1) { if (es[index].carry>0) es[index].status=carrying; else es[index].status=ending; } else { es[index].status=roaming; } } else if (es[index].status==carrying) { // printf("%.3lf: carried %d %d %d\n",nt,index,(int)(es[index].level+0.5),es[index].carry); if (es[index].carry>0) ans_time=max(ans_time,nt+es[index].stop); carry_total+=es[index].carry; es[index].carry=0; es[index].status=waiting; es[index].next_time+=es[index].stop; } else if (es[index].status==roaming) { // printf("%.3lf: apparture %d %d %d\n",nt,index,(int)(es[index].level+0.5),es[index].carry); int pos=es[index].dest; int k=min(ns[pos],es[index].cap-es[index].carry); es[index].carry+=k; ns[pos]-=k; if (pos>0) flag=1; es[index].status=waiting; es[index].next_time+=es[index].stop; // printf("%.3lf: apparture %d %d %d\n",nt,index,(int)(es[index].level+0.5),es[index].carry); } } t=nt; } if (!flag) ans_time=0; printf("%d %.6lf\n",carry_total,ans_time); } }