Задача жестянщика. Можно ли из круглой заготовки радиусом [latex]r[/latex] вырезать две прямоугольные пластинки с размерами [latex] a[/latex] × [latex] b[/latex] и [latex] c[/latex] × [latex]d[/latex]?
1.6 3 0 3 0 | We can |
1.6 3 1 3 1 | We can’t |
2 3 1 3 1 | We can |
2 5 1 4 1 | We can’t |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#include <iostream> #include <math.h> using namespace std; double sort(double a,double b) //ссортировка сторон прямоугольника на длину и ширину { double q; if (b>a) { q=b; a=b; a=q; } return a,b; } int main() { float r,a,b,c,d,q;//вводим переменные для входных данных float d1,d2;//переменные для определения длинны до центра круга при радиусе r scanf("%f %f %f %f %f", &r , &a , &b , &c , &d ); sort(a,b);sort(c,d); if ((a<r*2) && (c<r*2))//проверка не больше ли стороны ,чем диаметр { d1 = sqrt(r*r-(a/2)*(a/2));//ищем расстояние до центра от середины длины первого прямоугольника d2 = sqrt(r*r-(c/2)*(c/2));//ищем расстояние до центра от середины длины второго прямоугольника if (d < d2+(d1-b))//если ширина второго прямоугольника меньше суммы его длинны до центра круга и разности длинны до центра первого прямоугольник с его шириной(Если ширина первого прямоугольника больше его длинны до центра,то для ширины второго будет меньше места,это понятно) { printf("We can"); } else { printf("We can't"); } } else { printf("We can't!"); } return 0; } |
Рассмотрим как выглядит прямоугольник в круге.
Можно заметить, что [latex] h=d1[/latex] (длина до центра окружности) — это катет прямоугольного треугольника, значит его можно найти по теореме Пифагора , зная радиус круга [latex] R[/latex] и катит [latex] r[/latex] (в нашем случае [latex] a/2[/latex]) [latex] h=\sqrt{R^2-r^2}[/latex]). Вычитая из полученного [latex] h=d1[/latex] ширину [latex] b[/latex] мы получим сколько он места занимает при данной длине и ширине относительно центра круга. (Если у нас [latex] b<d1[/latex], то для второго прямоугольника у нас будет больше места) Тоже самое мы проделываем и для второго прямоугольника и получаем наше [latex] h2=d2[/latex]. Дальше размещаем наши прямоугольники параллельно друг другу и смотрим, хватает ли места второму прямоугольнику места с учетом его ширины (Если по ширине второй прямоугольник не превышает оставшегося места) [latex]d<d2+(d1-b)[/latex].
Реализация на Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
/* package whatever; // don't place package name! */ import java.util.*; import java.lang.*; import java.io.*; /* Name of the class has to be "Main" only if the class is public. */ class Ideone{ static void swap(double a, double b){ if(b > a){ double q = a; a = b; b = q; } } public static void main (String[] args) { double d1, d2;//переменные для определения длинны до центра круга при радиусе r Scanner in = new Scanner(System.in); double r = in.nextDouble(); double a = in.nextDouble(); double b = in.nextDouble(); double c = in.nextDouble(); double d = in.nextDouble(); swap(a, b);swap(c, d); if ((a < r*2) && (c < r*2)){ d1 = Math.sqrt(r*r-(a/2)*(a/2));//ищем расстояние до центра от середины длины первого прямоугольника d2 = Math.sqrt(r*r-(c/2)*(c/2));//ищем расстояние до центра от середины длины второго прямоугольника if (d < d2 + (d1 - b)){ System.out.println("We can"); } else{ System.out.println("We can't"); } } else{ System.out.println("We can't!"); } } } |
Для отправки комментария необходимо войти на сайт.