#include #include #define MAX 20100 double L; // délka kanálu double S; // šířka kanálu int A,B; // počet vybraných míst na levé a pravé straně kanálu double a[MAX],b[MAX]; // umístění vybraných míst na levé a pravé straně kanálu unsigned char optimalni_reseni[MAX][MAX/4]; // bitové pole pro uložení optimálního řešení // následují makra pro práci s tímto polem #define prirad(pole,pozice,hodnota) pole[(pozice)/4] |= (hodnota) << (2*((pozice)%4)) #define vrat(pole,pozice) ((pole[(pozice)/4] >> (2*((pozice)%4))) & 3) double spocitej_delku(double x, double y) { // vypočte délku přívozu mezi místy ve vzdálenostech x a y na stranách kanálu return sqrt((x-y)*(x-y) + S*S); } void nacti_zadani(void) { scanf("%lf %lf %d %d", &L, &S, &A, &B); for (int i=0; i