| 
 | 
back to boardAC with C++ #include <iostream> #include <cmath>   using namespace std;   int main(){     double x1 = 0, y1 = 0, x2 = 0, y2 = 0;     double px = 0, py = 0;     double length;       double A = 0;     double B = -1;     double C = 0;     double slope = 0;       cin>>x1>>y1>>x2>>y2>>px>>py>>length;       // get the equation of pineapple line in the form Ax + By + c = 0
      if((x2 - x1) != 0){         slope = (y2 - y1) / (x2 - x1);         A = slope;         C = y2 - slope * x2;     }       if((x2 - x1) == 0){         A = 1;         B = 0;         C = -x1;     }       // now since we have Ax + By + C = 0     // we can find the shortest distance between the point and the line       double short_dist = fabs(A*px + B*py + C) / sqrt(pow(A, 2) + pow(B, 2));     double dist_x1y1 = fabs(sqrt(pow(px-x1, 2) + pow(py-y1, 2)));     double dist_x2y2 = fabs(sqrt(pow(px-x2, 2) + pow(py-y2, 2)));       // once we have calculated the shorted distance, we need to     // find out the point lying on that pineapple line which is     // closest to the peg       double slope_new = 0;     double B_new = 0;     double C_new = 0;     double A_new = 0;     bool status = true;       if((x2 - x1) == 0){         slope_new = 0; // the other line has slope of inifinity, so this is parallel         B_new = 1;         A_new = 0;         C_new = -py;         status = false;     }       if((y2 - y1) == 0){         B_new = 0;         A_new = 1;         C_new = -px;         status = false;     }       if(status){         slope_new = -1.0/slope;         C_new = py - slope_new*px;         A_new = slope_new;         B_new = -1;     }       // calculating the point of intersection       double inter_X = (-C*B_new - B*(-C_new)) / (A*B_new - B*A_new);     double inter_Y = (A*(-C_new) - (-C*A_new))/(A*B_new - B*A_new);       // now check whether this point lies between the given points or not ?     // to do that we need to check whether both of the above calculated     // coordinates lie between the range of x1, y1 and x2, y2       double min_x_coor = min(x1, x2);     double min_y_coor = min(y1, y2);     double max_x_coor = max(x1, x2);     double max_y_coor = max(y1, y2);       if(inter_X >= min_x_coor && inter_X <= max_x_coor && inter_Y >= min_y_coor && inter_Y <= max_y_coor){         // this means, the point lies on the line         double one_pineapple_distance = short_dist - length;         if(one_pineapple_distance <= 0){             cout<<"0.00"<<endl;         }         else             printf("%.2f\n", one_pineapple_distance);           // now to eat all the pineapples         double larger_distance = max(dist_x1y1, dist_x2y2);         if(larger_distance - length <= 0){             cout<<"0.00"<<endl;         }         else             printf("%.2f\n", larger_distance - length);     }       // or else the perpendicuar point does not lies on the line     else{         // first shorter one         double shorter_distance = min(dist_x1y1, dist_x2y2);         double larger_distance = max(dist_x1y1, dist_x2y2);           double pineapple_1 = shorter_distance - length;         if(pineapple_1 <= 0){             cout<<"0.00"<<endl;         }         else             printf("%.2f\n", pineapple_1);           double pineapple_all = larger_distance - length;         if(pineapple_all <= 0){             cout<<"0.00"<<endl;         }         else             printf("%.2f\n", pineapple_all);     }     return 0; } Re: AC with C++ Posted by  kwetril 25 Dec 2010 01:47 вай, как много кода) с помощью численных методов решение в 30 строк AC) Re: AC with C++ Posted by  mikroz 16 Oct 2013 22:41 С помощью точной формулы решение в 25 строк.  |  
  | 
|