#include #include using namespace std; #define MAX_TIME 2000000100 int main() { int t[3], d, n[3], a; queue nastup[3]; queue vystup[3]; scanf("%d%d%d%d", &t[0], &t[1], &t[2], &d); for (int i = 0; i < 3; i++) { scanf("%d", &n[i]); for (int j = 0; j < n[i]; j++) { scanf("%d", &a); nastup[i].push(a); } nastup[i].push(MAX_TIME); // vložíme fiktivní poslední nástup } int prvniNastupPos, prvniNastupCas; int prvniVystupCas, prvniVystupPos; int pocetDeti = 0; while(1) { prvniNastupCas = MAX_TIME; prvniNastupPos = -1; for (int i = 0; i < 3; i++) // najdeme první nezpracovaný nástup { if (nastup[i].front() < prvniNastupCas) { prvniNastupCas = nastup[i].front(); prvniNastupPos = i; } } if (prvniNastupCas == MAX_TIME) break; // vyčerpali jsme všechno, končíme prvniVystupCas = MAX_TIME; for (int i = 0; i < 3; i++) // najdeme první nepoužitý výstup { if (vystup[i].size() == 0) continue; if (vystup[i].front() < prvniVystupCas) { prvniVystupCas = vystup[i].front(); prvniVystupPos = i; } } if (prvniVystupCas <= prvniNastupCas) // můžeme tento výstup použít vystup[prvniVystupPos].pop(); else pocetDeti++; nastup[prvniNastupPos].pop(); vystup[prvniNastupPos].push(prvniNastupCas + t[prvniNastupPos] + d); } printf("%d\n", pocetDeti); return 0; }