#include #include #include using namespace std; class pond{ public: int volume; int mass; int accepted; int overflowed; bool full() { return mass >= volume; } bool justFilled() { return mass == volume; } void setAccepted(int amm) { accepted = amm; mass += amm; } void accept(int amm) { accepted += amm; mass += amm; } void overflow(pond &other) { if (!full()) return; other.accept(mass - volume); overflowed = mass - volume; mass = volume; } void overflow() { if (!full()) return; overflowed = mass - volume; mass = volume; } }; int main() { // ios::sync_with_stdio(false); int numPonds; int prietok; while ((cin >> numPonds) && (cin >> prietok)) { int fullPonds = 0; vector ponds(numPonds); vector justFilledPonds(numPonds); for (pond &p : ponds) { cin >> p.volume; p.mass = 0; p.overflowed = 0; } int iterations = 0; bool lastWasFilled = false; double lastFilled = 0; double lastToFillFilled = 0; while (true) { int numJustFilledPonds = 0; for (pond &p : ponds) { bool itWasFull = p.full(); p.setAccepted(1); if (!itWasFull && p.full()) { justFilledPonds[numJustFilledPonds++] = &p;} if (p.mass == p.volume) fullPonds++; } for (int i = 0; i < ponds.size() - 1; i++) { pond &p = ponds[i]; bool itWasFull = p.full(); ponds[i].overflow(ponds[i+1]); if (!itWasFull && p.full()) { justFilledPonds[numJustFilledPonds++] = &p;} } ponds.rbegin()->overflow(); if (!lastWasFilled && ponds.rbegin()->full()) { lastWasFilled = true; pond *p = &(*ponds.rbegin()); lastFilled = (iterations + (double)(p->accepted - p->overflowed) / p->accepted) / prietok; justFilledPonds[numJustFilledPonds++] = p; } bool allAreFilled = true; for (pond &p : ponds) { if (!p.full()) { allAreFilled = false; } } if (allAreFilled) { for (int i = 0; i < numJustFilledPonds; i++) { pond *p = justFilledPonds[i]; double time = (iterations + (double)(p->accepted - p->overflowed) / p->accepted) / prietok; if (time > lastToFillFilled) lastToFillFilled = time; } break; } iterations++; } cout << lastFilled << ' ' << lastToFillFilled << '\n'; } return 0; }