Входные данные:
Каждая строка является отдельным тестом и содержит одно целое число — длину стороны квадрата $n$ (1 $\leqslant$ $n$ $\leqslant$ 1000).
Выходные данные:
Для каждого теста выведите в одной строке периметр и площадь квадрата.
Тесты
№
Входные данные
Выходные данные
1
3
5
10
12 9
20 25
40 100
2
3
3
3
12 9
12 9
12 9
3
1000
1
500
4000 1000000
4 1
2000 250000
Код
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
usingnamespacestd;
intmain(){
intn,P,S;
while(cin>>n){
P=4*n;// считаем периметр квадрата
S=n*n;// считаем площадь квадрата
cout<<P<<" "<<S<<"\n";
}
return0;
}
Решение
У нас дана сторона квадрата $n$.
Находим периметр квадрата, используя формулу $P = 4n$.
Находим площадь квадрата, используя формулу $S = n^{2}$.
Так как каждая новая строка — новое значение для стороны квадрата и таких строк неизвестное количество то используем
while(cin>>n) для потоковой обработки данных.
Как известно, простой многоугольник — это фигура, состоящая из не пересекающихся отрезков («сторон»), соединённых попарно с образованием замкнутого пути. По заданному простому многоугольнику и точке требуется определить, лежит ли эта точка внутри или на границе этого многоугольника или вне его.
Входные данные
В первой строке заданы три числа: [latex]n (3 \le n \le 10^5)[/latex] и координаты точки. Далее в $n$ строках заданы по паре чисел — координаты очередной вершины простого многоугольника в порядке обхода по или против часовой стрелки.
Выходные данные
Вывести строку «YES», если заданная точка содержится в приведённом многоугольнике или на его границе, и «NO» в противном случае.
Тесты
Входные данные
Выходные данные
3 0 0
1 0
0 1
1 1
NO
4 3 2
0 0
1 5
5 5
6 0
YES
3 5 6
2 3
8 0
-1 -3
NO
4 -2 3
0 0
5 0
0 6
3 3
NO
5 3 1
9 2
3 0
-2 -4
-4 0
-4 5
YES
Код программы
C++
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
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
usingnamespacestd;
structpoint{
intx;
inty;
};
intf(point*p,intN,intx,inty){
inti1,i2,n,S,S1,S2,S3,flag;
for(n=0;n<N;n++){
flag=0;
i1=n<N-1?n+1:0;
while(flag==0){
i2=i1+1;
if(i2>=N)
i2=0;
if(i2==(n<N-1?n+1:0))
break;
S=abs(p[i1].x*(p[i2].y-p[n].y)+
p[i2].x*(p[n].y-p[i1].y)+
p[n].x*(p[i1].y-p[i2].y));
S1=abs(p[i1].x*(p[i2].y-y)+
p[i2].x*(y-p[i1].y)+
x*(p[i1].y-p[i2].y));
S2=abs(p[n].x*(p[i2].y-y)+
p[i2].x*(y-p[n].y)+
x*(p[n].y-p[i2].y));
S3=abs(p[i1].x*(p[n].y-y)+
p[n].x*(y-p[i1].y)+
x*(p[i1].y-p[n].y));
if(S==S1+S2+S3){
flag=1;
break;
}
i1++;
if(i1>=N)
i1=0;
}
if(flag==0)
break;
}
returnflag;
}
intmain(){
intn,x,y;
cin>>n>>x>>y;
point*p=newpoint[n];
for(inti=0;i<n;i++)
cin>>p[i].x>>p[i].y;
cout<<(f(p,n,x,y)?"YES":"NO");
return0;
}
Решение
Задача сводится к поиску площадей. Считаю площадь треугольника, образующегося тремя последовательными точками многоугольника. Далее считаю площади треугольников которые заданная точка образует с каждой парой точек из этой пары. Если площадь первого треугольника равна сумме площадей этих, то точка находится в треугольнике, а следовательно и в многоугольнике. Если нет перехожу к следующей тройке точек. Если точка не принадлежит ни одному треугольнику, то точка находится вне многоугольника.
В тридесятом государстве объявлено новое соревнование. Каждому участнику дается лист бумаги, ширина которого строго равна одному магическому метру, на котором надо начертить таблицу, имеющую размер $m \times n$. При этом для каждой ячейки таблицы указана минимальная площадь, которую должна эта ячейка занимать. Все строки таблицы равны между собой. Задача участников — начертить таблицу наименьшей высоты. Алиса снова очень хочет победить, но она все еще плохо знает математику, поэтому она просит Вас помочь ей в этом непростом деле.
Входные данные
Первая строка содержит два натуральных числа $m$ и $n$, $(1 \leqslant m,n \leqslant 100).$ Далее идут $m$ строк содержащие по $n$ натуральных чисел — $s_1, s_2, \cdots , s_{n-1}, s_n$ — минимальные площади каждой ячейки $(1 \leqslant s_i \leqslant 100).$
Так как все строки равны между собой, тогда решение задачи состоит в том, чтобы разбить таблицу на строки размером $1 \times n$ и найти их минимальную высоту. Как находить высоту $h$ для каждой такой строки было показано тут. Тогда минимальная высота всей таблицы равна $m \cdot h.$
В тридесятом государстве объявлено соревнование. Каждому участнику дается лист бумаги, ширина которого строго равна одному магическому метру, на котором надо начертить таблицу, имеющую размер $1 \times n$. При этом для каждой ячейки таблицы указана минимальная площадь, которую должна эта ячейка занимать. Задача участников — начертить таблицу наименьшей высоты и вычислить ширину каждой ячейки. Алиса очень хочет победить, но она плохо знает математику, поэтому она просит Вас помочь ей в этом непростом деле.
Входные данные
Первая строка содержит натуральное число $n, \ (1 \leqslant n \leqslant 100).$ Вторая строка содержит $n$ натуральных чисел — $s_1, s_2, \cdots , s_{n-1}, s_n$ — минимальные площади каждой ячейки $(1 \leqslant s_i \leqslant 100).$
Выходные данные
Вывести ширину каждой ячейки, учитывая, что высота таблицы должна быть минимальной, округлив ответ до четвертого знака после запятой.
Петя и Вася готовились к контрольной работе по теме ”Периметр и площадь фигур”. Петя нарисовал геометрическую фигуру, закрасив на листе в клеточку некоторые клеточки синим цветом, а Вася вычислял периметр образованной фигуры и дорисовывал максимальное количество квадратов красным цветом таким образом, чтобы периметр новообразованной фигуры оставался таким же.
Напишите программу, которая по заданным координатам закрашенных синих квадратов найдет максимальное количество красных квадратов, которое можно дорисовать так, чтобы периметр новообразованной фигуры не изменился.
Входные данные
В первой строке находится количество синих квадратов $n$ ($0 < n < 40404$). Далее идут $n$ строк, каждая из которых содержит координаты $x$, $y$ ($-101 \leq x, y \leq 101$) левых нижних углов синих квадратов.
Каждый синий квадрат имеет хотя бы одну общую точку хотя бы с одним другим синим квадратом. Фигура, образованная синими квадратами, является связной.
Для начала, нужно понять, что для каждой связной фигуры, составленной из одинаковых квадратов, существует как минимум один прямоугольник с таким-же периметром, что и фигура. Тогда каждую фигуру можно будет достраивать до прямоугольника, сохраняя периметр.
Чтобы доказать это, пусть сторона квадрата равна $1$. Тогда периметр фигуры, составленной из этих квадратов, всегда будет делится на $2$ (это легко понять, строя такие фигуры на листке бумаги: добавление каждого нового квадрата в фигуру может изменить периметр только на $-4, -2, 0, 2, 4$). А так как периметр прямоугольника равен $2 * (a + b)$, где $a, b$ – стороны прямоугольника, то для существования прямоугольника с таким-же периметром должно выполняться условие $\forall p \in \mathbb{N} , p > 2 \rightarrow \exists a,b \in \mathbb{N} : 2p = 2*( a + b )$. Очевидно, что условие действительно выполняется для всех $p>2$.
Запишем нашу фигуру в массив squares. После чего посчитаем ее периметр: каждый непустой квадратик фигуры добавляет $1$ к периметру за каждую пустую клеточку слева, справа, сверху или снизу от него. Далее будем искать все подходящие прямоугольники, записывая максимальную площадь в переменную max: перебирая значения первой стороны $j$, высчитываем через периметр вторую сторону $i = \displaystyle \frac{p}{2} — j$. Площадь будем считать, как разницу площади прямоугольника и изначальной фигуры (число $n$ равно площади фигуры, потому что площадь каждого квадрата равна $1$).
В конце, выводим разницу максимальной площади и площади изначальной фигуры (площадь изначальной фигуры равна $n$, ведь площадь каждого квадрата равна $1$).
Ваш любимый дядя – директор фирмы, которая делает евроремонты в офисах. В связи с финансово-экономическим кризисом, дядюшка решил оптимизировать свое предприятие.
Давно ходят слухи, что бригадир в дядюшкиной фирме покупает лишнее количество стройматериалов, а остатки использует для отделки своей новой дачи. Ваш дядя заинтересовался, сколько в действительности банок краски необходимо для покраски стены в офисе длиной $L$ метров, шириной $W$ и высотой $H$, если одной банки хватает на $16$ метров квадратных, а размерами дверей и окон можно пренебречь? Заказов много, поэтому дядя попросил написать программу, которая будет все это считать.
Входные данные
В первой строке содержится количество заказов. Описание каждого заказа состоит из трех натуральных чисел $L$, $W$, $H$ — длины, ширины и высоты офиса в метрах соответственно, каждое из которых не превышает $1000$.
Выходные данные
Для каждого заказа выводится в отдельную строку одно число – количество банок краски, необходимых для окраски офиса.
Тесты
Входные данные
Выходные данные
$1$
$1$ $1$ $1$
$1$
$3$
$8$ $7$ $10$
$15$ $8$ $4$
$3$ $5$ $4$
$19$
$12$
$4$
$2$
$27$ $88$ $19$
$999$ $999$ $999$
$274$
$249501$
Код программы
e-olymp 2817 Solution
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
usingnamespacestd;
intmain(){
intr;
cin>>r;
for(inti=0;i<r;++i){
intl,w,h;
cin>>l>>w>>h;
ints=2*h*(w+l);
cout<<(s%16!=0?s/16+1:s/16)<<endl;
}
return0;
}
Решение задачи
Рассчитаем площадь стен комнаты как сумму площадей $4$ прямоугольников: $$hw + hl + hw + hl = 2hw + 2hl = 2h \cdot (w + l)$$ Теперь, зная площадь стен, рассчитаем количество банок краски. Для этого поделим площадь стен на $16$ и округлим вверх. Для округления вверх можно использовать тернарный условный оператор: если $s$ делится нацело на $16$, то ответ будет $\displaystyle \frac{s}{16}$, в противном случае – $\displaystyle \frac{s}{16} + 1$ (деление переменной int – целочисленное). Так как в задаче необходимо обрабатывать несколько таких примеров подряд, то все вычисления взяты в цикл от $0$ до $r$ (название переменной $r$ в самой задаче не указано, оно выбрано произвольно).
На плоскости задано [latex]n[/latex] точек с целочисленными координатами. Никакие три точки не лежат на одной прямой. Определить [latex]k[/latex] — количество треугольников с вершинами в заданных точках и целочисленной площадью.
Входные данные
В первой строке содержится число [latex]n[/latex]. В последующих [latex]n[/latex] строках содержаться пары целых чисел — координаты очередной точки [latex](x_i, y_i)[/latex]. Известно, что [latex]0 < n, |x_i|,|y_i| \leq 5000 [/latex].
Выходные данные
Искомое число [latex]k[/latex].
Тесты
Входные данные
Выходные данные
5
2 -1
3 0
0 4
-3 0
-2 1
6
5
0 0
2 4
6 6
10 34
-42 -48
10
4
0 0
0 1
1 0
1 1
0
8
0 0
2 2
1 1
3 3
0 1
2 1
1 0
1 2
24
5
0 0
0 1
-1 0
-1 -1
3 -3
3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
usingnamespacestd;
intmain(){
unsignedintn,x1,x2,x3,y1,y2,y3,A[4]={0,0,0,0};
unsignedlonglongc=0;
cin>>n;
for(inti=0;i<n;i++){
cin>>x1>>y1;
if(x1%2==0andy1%2==0)A[0]++;
elseif(x1%2==1andy1%2==0)A[1]++;
elseif(x1%2==0andy1%2==1)A[2]++;
elseA[3]++;
}
for(inti=0;i<4;i++){
for(intj=0;j<4;j++){
if(i==j)c+=A[i]*(A[i]-1)*(A[i]-2)/6;
elsec+=A[i]*(A[i]-1)*A[j]/2;
}
}
cout<<c;
return0;
}
Решение задачи
Учитывая теорему Пика, получаем, что площадь каждого из треугольников, которые можно составить, либо равна целому числу, либо помимо целой части содержит [latex]\frac{1}{2}[/latex]. Нас интересует лишь четность псевдоскалярного(косого) произведения. Берем у всех координат остаток от деления на [latex]2[/latex]. Получаем не более [latex]4[/latex] различных точек: [latex] (0;0), (0;1), (1;0), (1;1)[/latex]. Составляем все возможные треугольники из полученных точек, и считаем те, у которых формула дает четное число, учитывая количество координат каждого типа.
На границе окружности с центром в начале координат и радиусом $r$ заданы $n$ различных точек. Поскольку все точки расположены на одной окружности, то любые три из них не коллинеарны, и поэтому образуют треугольник. Вам необходимо вычислить суммарную площадь всех этих $C_{n}^3$ треугольников.
Входные данные Состоит из не более чем $16$ тестов. Каждый тест начинается двумя целыми числами $n \left(0 ≤ n ≤ 500\right)$ и $r \left(0 < r ≤ 100\right)$. Через $n$ обозначено количество точек, а через $r$ радиус окружности. Центр окружности находится в центре координат. Дальше следуют $n$ строк, каждая из которых содержит действительное число $θ \left(0 ≤ θ < 360 \right)$, которое определяет угол в градусах между точкой и направлением $x$-оси. Например, если $θ$ равно $30$ градусов, то соответствующая точка имеет декартовы координаты $\left(r \cdot \cos(30°), r \cdot \sin(30°) \right)$. Последняя строка содержит $n = r = 0$ и не обрабатывается.
Выходные данные Для каждого теста в отдельной строке вывести целое число — суммарную площадь (округленную до ближайшего целого) всех возможных треугольников, образованных заданными $n$ точками.
Тесты
Входные данные
Выходные данные
5 10
10
100
300
310
320
3 20
10
100
300
0 0
286
320
3 5
25
176
243
0 0
25
4 20
30
80
130
330
0 0
822
2 7
30
230
0 0
0
Код программы
e-olymp 1503 C++ solution
C++
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
#include <iostream>
#include <algorithm>
#include <math.h>
#include <stdio.h>
usingnamespacestd;
intmain(){
doubleang,s,sq,r2,res,M[500];
intn,r,pts;
while(cin>>n>>r,n+r!=0){
for(inti=0;i<n;i++){
cin>>M[i];
M[i]=M[i]*M_PI/180;
}
sort(M,M+n);
res=M_PI*r*r*n*(n-1)*(n-2)/6;
r2=r*r/2.0;
sq=M_PI*r*r;
for(inti=0;i<n;i++){
for(intj=i+1;j<n;j++){
ang=M[j]-M[i];
if(ang<M_PI){
s=r2*(ang-sin(ang));
}else{
ang=2*M_PI-ang;
s=sq-r2*(ang-sin(ang));
}
pts=n-(j-i+1);
res=res-s*pts;
pts=n-2-pts;
res=res-(sq-s)*pts;
}
}
printf("%.f\n",res);
}
return0;
}
Решение задачи
Радианная мера точек заносится в массив, после чего массив сортируется по возрастанию с помощью функции
sort().
В переменную
res изначально заносится площадь, равная площади кругов радиуса $r$,
то есть значение $C_{n}^3 \cdot \pi \cdot r^2 = n(n-1)(n-2)(n-2)\pi \cdot \frac{r^2} {6}$. Значение $\frac{r^2} {2}$ присваивается переменной
r2, а
sq – площадь одного круга, то есть $\pi \cdot r^2$.
Перебираются пары точек, а затем вычисляется угол.
Если угол меньше, то проходимся по меньшему сегменту, площадь которого равна $\pi r^2-0.5r^2(\alpha-\sin \alpha)$, $\alpha = 2\pi -\alpha$. В ином случае мы проходим по большему сегменту.
В любом случае переменной
s присваивается площадь сегмента, который мы проходим от $P_{i}$ к $P_{j}$ при движении против часовой стрелки.
Количество точек, лежащих на сегменте, равно $n-(j-i+1)$.
Значит, из переменной
res необходимо вычесть площадь сегмента
s такое количество раз, которому равно количество точек, то есть
pts .
Количество точек, которые лежат на сегменте площади
s , равно $n-2- $
pts.
Площадь противоположного сегмента равна разности площади круга и сегмента. Для получения ответа вычитаем площадь противоположного сегмента из переменной
res такое количество раз, которое равно значению переменной
pts и выводим полученное значение.
Целочисленные стороны прямоугольника [latex]a[/latex] и [latex]b[/latex] [latex](1 ≤ a, b ≤ 1000)[/latex].
Выходные данные
Выведите площадь прямоугольника.
Тесты
#
ВХОДНЫЕ ДАННЫЕ
ВЫХОДНЫЕ ДАННЫЕ
1
[latex]1[/latex] [latex]1[/latex]
[latex]1[/latex]
2
[latex]2[/latex] [latex]4[/latex]
[latex]8[/latex]
3
[latex]511[/latex] [latex]428[/latex]
[latex]218708[/latex]
4
[latex]5555[/latex] [latex]4444[/latex]
[latex]24686420[/latex]
5
[latex]11[/latex] [latex]11[/latex]
[latex]121[/latex]
Код программы
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
usingnamespacestd;
intmain()
{
inta,b;
cin>>a>>b;
cout<<a*b<<endl;
return0;
}
Решение задачи
Прямоугольником называется четырехугольник, у которого все углы равны. Все углы в прямоугольнике прямые, т.е. составляют [latex]90°[/latex]. Площадь прямоугольника равна произведению его сторон [latex](a, b)[/latex]. Следовательно формула решения задачи будет такой: [latex]a · b[/latex].
Задано стороны [latex]a, b, c, d[/latex] и диагональ [latex]f[/latex] выпуклого четырехугольника. Определить площадь четырехугольника, используя вспомогательную функцию вычисления площади треугольника по формуле Герона.
Входные данные
В одной строке задано 5 действительных чисел [latex] a, b, с, d, f[/latex] [latex](0 < a, b, c, d, f ≤ 100)[/latex], как показано на рисунке.
Выходные данные
Вывести площадь четырехугольника с точностью 4 знака после десятичной точки.
Тесты
#
Входные данные
Выходные данные
1
2 2 2 2 2
3.4641
2
7 7 5 6 2
11.6120
3
9 5 3 2 4
2.9047
4
5 7 2 3 4
12.7027
5
7 8 6 2 5
22.0043
Код программы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <cmath>//данную библиотеку подключаем для того, чтобы была возможность извлечь корень
#include <iomanip>//данную библиотеку подключаем для того, чтобы установить кол-во знаков после запятой
usingnamespacestd;
intmain(){
doublea,b,c,d,f;//длины сторон треугольника
doubleS1,S2,SO;//площади треугольников и общая площадь соответственно
doubleP1,P2,p1,p2;//периметр и полупериметр соотвественно
SO=S1+S2;//находим общую площадь фигуры состоящую из двух треугольников
cout<<fixed<<setprecision(4)<<SO;
return0;
}
Решение задачи
Дано
Фигура, состоящая из двух треугольников;
Цель
Посчитать площадь данной фигуры;
Идея
Разбить фигуру на два треугольника и посчитать площадь каждого в отдельности, а потом сложить.
Способ решения
Вспомним формулу Герона [latex] S = \sqrt{p \cdot(p-a) \cdot(p-b) \cdot(p-c)}[/latex].
Поймем, что нам не хватает некоторых данных, а именно [latex]p[/latex].
Понимаем, что [latex]p[/latex] — это полупериметр, который находится по формуле [latex]p=\frac{P}{2}[/latex].
Возникает вопрос, что такое [latex]P[/latex] ? Приходим к выводу, что это периметр.
Находим формулу периметра, который равен [latex]P=a+b+c[/latex]. Данная формула была подведена под условие нашей задачи.
После того как мы вывели формулы, можем приступать к решению задачи.
Подставляя исходные данные в формулы, которые были представлены выше, получаем результат.
Более подробное описание каждого действия представлено выше в коде. Это сделано для того, чтобы пользователь получал ответы на интересующие его вопросы непосредственно в момент их возникновения.
В белом квадрате [latex]N[/latex] раз выполнили одну и ту же операцию: один из наименьших белых квадратов разбили на 4 одинаковых квадрата и 2 из них закрасили черным цветом. Для данного [latex]N[/latex] вычислить, сколько процентов занимает площадь черной фигуры.
Входные данные
Во входном файле одно число [latex]N[/latex]. [latex]1 ≤ N ≤ 100[/latex].
Выходные данные
В выходной файл нужно записать ответ, вычисленный с точностью 5 знаков после запятой по правилам математических округлений.
Тесты
Входные данные
Выходные данные
1
50.00000
3
65.62500
10
66.66660
50
66.66667
100
66.66667
Код программы
e-olymp 146
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <cmath>
#include <iomanip>
//Подключаем этот модуль,чтобы установить точность ответа
При [latex]N=1[/latex] площадь черной фигуры составляет [latex]50\%[/latex]. При [latex]N=2[/latex] площадь фигуры равна [latex]50\%+50\%\cdot 1/4[/latex]. При [latex]N=3[/latex] площадь черной фигуры составляет [latex]50\%+50\%\cdot 1/4+50\%\cdot 1/16[/latex]. Очевидно, что перед нами геометрическая прогрессия. Процент, занимаемый площадью черной фигуры, будем искать через сумму геометрической прогресcии: [latex]S_n={{b_1(1-q^N)}\over{1-q}}[/latex], где [latex]q={{b_2}\over{b_1}}={{12.5}\over{50}}=0.25[/latex], [latex]N-[/latex]кол-во операций.
Задача:
Пусть [latex]D[/latex] — заштрихованная часть плоскости и пусть u определяется по [latex]x[/latex] и [latex]y[/latex] следующим образом: [latex] u=\begin{cases}x^{2}-1, ; \text{ if } (x, y)\in D \\sqrt{\left| x-1 \right| } ; \text{ another case }\end{cases}[/latex] (запись [latex] (x, y)\in D [/latex] означает, что точка с координатами [latex]x, y[/latex] принадлежит [latex]D[/latex]).
Даны действительные числа [latex]x[/latex] и [latex]y.[/latex] Определить [latex]u.[/latex]
Тесты:
№
Вход
Выход
[latex]x[/latex]
[latex]y[/latex]
[latex]u[/latex]
1
0.3
0.3
0.836660
2
1
1
0.000000
3
2
2
1.000000
4
0
0
-1.000000
Код на языке C++:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <cmath>
usingnamespacestd;
intmain(){
floatx,y,u;
scanf("%f%f",&x,&y);
floata=x*x+y*y;
if((y<0)||(a>1)||((x>0)&&(a<0.3)))
{
printf("u=%f",sqrt(abs(x-1)));
}
else
{
printf("u=%f",x*x-1);
}
return0;
}
Код на языке Java:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
importjava.util.*;
importjava.lang.*;
importjava.io.*;
classMain{
publicstaticvoidmain(String[]args){
Scanner in=newScanner(System.in);
PrintWriter out=newPrintWriter(System.out);
floatx=in.nextFloat();
floaty=in.nextFloat();
floata=x*x+y*y;
if((y<0)||(a>1)||((x>0)&&(a<0.3))){
System.out.println(Math.sqrt(Math.abs(x-1)));
}
else{
System.out.println(x*x-1);
}
}
}
Решение:
Для решения задачи проверим не принадлежит ли выбранная точка полуплоскости [latex] y<0 [/latex].Затем следует проверить не лежит ли выбранная точка вне полукруга, радиус которого равен 1 . Следующим действием нужно проверить не находиться ли точка в вырезанной четвертине маленького круга, радиус которого равен 0.3 . Ссылки:
Онлайн компилятор ideone C++ .
Онлайн компилятор ideone Java .
Задача М63 из журнала «Квант» №1 за 1971 год, стр.39. Автор А.А. Кириллов.
Можно ли из плиток размером 1х2 сложить четырехугольник размером [latex] M\times N [/latex] так, чтоб при этом не было ни одного прямого «шва», соединяющего стороны квадрата и идущие по краям плиток.
Изображение как на рисунке не годиться так как тут есть «шов» [latex] AB [/latex].
Входные данные
Размеры четырёхугольника [latex] M [/latex] и [latex] N [/latex].
Выходные данные
Возможно ли это сделать [latex] Yes [/latex] или не возможно [latex] No [/latex].
Тесты
вводимые данные
выводимые данные
M
N
возможно || не возможно
2
16
no
6
6
no
66
69
yes
16
5
yes
99
71
no
7
7
no
78
77
yes
7
8
yes
Код задачи
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
usingnamespacestd;
intmain(){
longlongm,n;
cin>>m>>n;
if((m>=5&&n>=5&&((m*n)%2==0))){
if(m==6&&n==6){
cout<<"No";// согласно решению задачи
return0;
}
cout<<"Yes";//согласно общему решению
}
else{
cout<<"No";
}
return0;
}
Решение
Легко доказать, что прямоугольники [latex] {2\times m}, [/latex] [latex] {3\times m}, [/latex] [latex] {4\times m} [/latex] разрезать таким образом нельзя. Если же [latex] {m\geq{5}}, [/latex] [latex] {n\geq{5}} [/latex] и [latex] mn [/latex] четно (последнее условие разумеется необходимо), то во всех случаях кроме [latex]{6\times 6}[/latex] нужное разбиение существует. Ссылки ideone
Окно в университетской аудитории имеет форму прямоугольника с присоединенным в верхней части полукругом. Периметр всего окна равен [latex]P[/latex]. Определить радиус полукруга [latex]R[/latex], при котором площадь окна максимальна. Входные данные: Периметр окна [latex]P[/latex]. Выходные данные: Радиус полукруга [latex]R.[/latex]
Тесты
Входные данные
Выходные данные
№
[latex]P[/latex]
[latex]R[/latex]
1
100
14.0025
2
73
10.2218
3
14
1.96035
4
0
0
Код программы.
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <cmath>
usingnamespacestd;
intmain(){
doubleP,R;
cin>>P;
R=P/(4+M_PI);
cout<<R;
return0;
}
Решение
Университетское окно
Обозначим боковую сторону окна [latex]b[/latex], а нижнюю [latex]a[/latex]. [latex]R=\frac { a }{ 2 } [/latex], тогда периметр окна [latex]P=a+2b+\frac { \pi a }{ 2 } [/latex], а площадь равна сумме площадей прямоугольника и полукруга [latex]S=ab+\frac { \pi { a }^{ 2 } }{ 8 } [/latex]. Выразим сторону [latex]b[/latex] через [latex]a[/latex] и периметр [latex]P[/latex] : [latex]b=\frac { 2P-2a-\pi a }{ 4 } [/latex], тогда [latex]S=\frac { 4Pa-4a^{ 2 }-\pi a^{ 2 } }{ 8 } [/latex]. Вычислим производную функции [latex]S(a)[/latex]. [latex]S'(a)=\frac { 2P-4a-\pi a }{ 4 } [/latex], затем найдем точки экстремума функции:
[latex]\frac { 2P-4a-\pi a }{ 4 } =0[/latex], тогда [latex]a=\frac { 2P }{ 4+\pi } [/latex].
Найдём область допустимых значений для [latex]a[/latex]. Наибольшего значения [latex]a[/latex] достигает при [latex]b=0[/latex], [latex]P=a+ \frac {\pi a}{2}[/latex], соответственно [latex]a=\frac { 2P }{ 1+\pi } [/latex]. Значит областью допустимых значений является отрезок [latex][0; \frac { 2P }{ 2+\pi } ] [/latex]. Поскольку [latex]0 < \frac { 2P }{ 4+\pi } < \frac { 2P }{ 2+\pi }[/latex] делаем вывод, что [latex]a=\frac { 2P }{ 4+\pi } [/latex] попадет в область допустимых значений. Найдём максимальное значение функции на отрезке:
[latex]S(0)=0[/latex].
[latex]S(\frac { 2P }{ 4+\pi })= \frac { 4P ^ {2} }{ 32 + 8 \pi } [/latex].
[latex]S( \frac { 2P }{ 2+\pi })= \frac { 4P ^ {2} }{ 16 + 8 \pi } \cdot \frac { \pi }{ 2+ \pi } [/latex].
[latex] \frac {S(\frac { 2P }{ 4+\pi })}{S( \frac { 2P }{ 2+\pi })} = \frac { 4+4\pi +{ \pi }^{ 2 } }{ 4\pi +{ \pi }^{ 2 } } [/latex].
Тогда [latex]S(0) < S(\frac { 2P }{ 2+\pi }) < S(\frac { 2P }{ 4+\pi }) [/latex].
Значит площадь окна [latex]S[/latex] достигает максимального значения при [latex]a=\frac { 2P }{ 4+\pi }[/latex], из чего следует [latex]R=\frac { P }{ 4+\pi }[/latex].
Задача. Найти площадь полной поверхности тетраэдра три стороны которого образованы векторами [latex]\overrightarrow{a}=(a_x,a_y,a_z)[/latex], [latex] \overrightarrow{b}=(b_x,b_y,b_z)[/latex] и [latex]\overrightarrow{c}=(c_x,c_y,c_z)[/latex]. Тесты:
doubleA1A2=Math.sqrt(ax*ax+ay*ay+az*az);//вычислим длину ребра А1A2
doubleA1A3=Math.sqrt(bx*bx+by*by+bz*bz);//вычислим длину ребра А1A3
doublecosa=(ax*bz+ay*by+az*bz)/(A1A2*A1A3);//вычислим косинус угла между ребрами А1A2 и А1A3
doublesina=Math.sqrt(1-cosa*cosa);//вычислим их синус
doubles1=0.5*A1A2*A1A3*sina;//найдём площадь поверхности
doubleA1A4=Math.sqrt(cx*cx+cy*cy+cz*cz);//вычислим длину ребра А1A4
doublecosb=(ax*cx+ay*cy+az*cz)/(A1A2*A1A4);//вычислим косинус угла между ребрами А1A2 и А1A4
doublesinb=Math.sqrt(1-cosb*cosb);//вычислим их синус
doubles2=0.5*A1A2*A1A4*sinb;//найдём площадь поверхности
doublecosc=(bx*cx+by*cy+bz*cz)/(A1A2*A1A3);//вычислим косинус угла между ребрами А1A3 и А1A4
doublesinc=Math.sqrt(1-cosc*cosc);//вычислим их синус
doubles3=0.5*A1A3*A1A4*sinc;//найдём площадь поверхности
doubleA2A3=Math.sqrt((cx-bx)*(cx-bx)+(cy-by)*(cy-by)+(cz-bz)*(cz-bz));//вычислим длину ребра А2A3
doubleA2A4=Math.sqrt((cx-ax)*(cx-ax)+(cy-ay)*(cy-ay)+(cz-az)*(cz-az));//вычислим длину ребра А2A4
doublecosd=((cx-bx)*(cx-ax)+(cy-ay)*(cy-by)+(cz-az)*(cz-bz))/(A2A3*A2A4);//вычислим косинус угла между ребрами А2A3 и А2A4
doublesind=Math.sqrt(1-cosd*cosd);//вычислим их синус
doubles4=0.5*A2A3*A2A4*sind;//найдём площадь поверхности
doubles=s1+s2+s3+s4;//найдём площадь полной поверхности
System.out.println(s);//выведем её результат
}
}
Решение:
Координаты векторов находим по формуле:
[latex] \overrightarrow{A_2A_4}=(c_x-a_x,c_y-a_y,c_z-a_z) [/latex]
здесь [latex] a_x, a_y, a_z[/latex] — координаты точки [latex]A_2[/latex]; [latex]c_x, c_y, c_z[/latex] — координаты точки [latex]A_4[/latex];
Таким же образом находим остальные координаты векторов.
Модули векторов (длина ребер пирамиды)
Длина вектора [latex]\overrightarrow{a}(a_x;a_y;a_z)[/latex] выражается через его координаты формулой:
[latex] \left| \overrightarrow{A_1A_2} \right| =\sqrt { ({ a_x) }^{ 2 }+({ a_y) }^{ 2 }+({ a_z) }^{ 2 } } [/latex];
Таким же способом находим другие модули векторов.
Площадь грани можно найти по формуле:
[latex] s_1=\frac { 1 }{ 2 } \vec{A_1} \times \vec{A_2} \sin \angle{A_2A_3} [/latex]
где
[latex] \sin \angle{ A_2A_3 =\sqrt { 1-{ (\cos \angle{ A_2A_3) } }^{ 2 } } } [/latex]
Так же будем находить и другие.
Найдем угол между ребрами [latex] A_1A_2(a_x;a_y;a_z) [/latex] и [latex] A_1A_3(b_x;b_y;b_z) [/latex]:
[latex] \cos \angle{ A_2A_3 =\frac { a_x b_x+a_y b_y+a_z b_z }{ \left| A_2A_3 \right| } } [/latex]
Так мы найдём и другие 3 площади граней.
Площадь полной поверхности.
[latex] s=s_1+s_2+s_3+s_4. [/latex]
Найти площадь треугольника по заданным координатам его вершин [latex] A(x_a,y_a,z_a )[/latex], [latex]B(x_b,y_b,z_b)[/latex] и [latex]C(x_c,y_c,z_c)[/latex].
Входные данные
Координаты вершин треугольника [latex]ABC[/latex]
Выходные данные
Площадь [latex]S[/latex] треугольника [latex]ABC[/latex]
Тесты
Входные данные
Выходные данные
[latex]x_a [/latex]
[latex]y_a [/latex]
[latex]z_a [/latex]
[latex]x_b [/latex]
[latex]y_b [/latex]
[latex]z_b [/latex]
[latex]x_c [/latex]
[latex]y_c [/latex]
[latex]z_c [/latex]
[latex]S [/latex]
-2
1
2
3
-3
4
1
0
9
19.7864
-3
13
-5
6
11
12
4
8
18
50.5618
-6
0
4
5
1
3
-3
-1
-4
43.307
-6
-2.3
-8.2
1.9
-7.8
0.2
-8.5
3.4
-8.9
28.0909
Код программы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <cmath>
usingnamespacestd;
//функция высчитывает расстояние между двумя координатами, координаты передаются в функцию при вызове
Используя известные нам координаты вершин треугольника и формулу вычисления расстояния между двумя точками в пространстве [latex]AB=\sqrt{(x_2-x_1)^2+(y_2-y_1)^2+(z_2-z_1)^2}[/latex]
можно найти длины сторон треугольника [latex]ABC[/latex]. Для нахождения площади используем Формулу Герона[latex]AB=\sqrt{p*(p-a)*(p-b)*(p-c)}[/latex] перед этим находим полупериметр [latex]p[/latex] по формуле [latex]p=\frac{a+b+c}{2}[/latex] подставляем значение и выводим конечный результат.
Даны катеты прямоугольного треугольника. Найти его гипотенузу и площадь.
Входные данные
В одной строке задано два числа — катеты прямоугольного треугольника соответственно [latex]a[/latex] и [latex]b[/latex]. Значения катетов не превышают по модулю [latex]100[/latex].
Выходные данные
В одной строке через пробел вывести гипотенузу и площадь данного прямоугольного треугольника с 2 знаками после запятой.
Каждый в школе узнает как найти гипотенузу и площадь прямоугольного треугольника. Для того чтобы найти гипотенузу надо использовать теорему Пифагора [latex]c^2=a^2+b^2\rightarrow\sqrt(a^2+b^2)[/latex], а для нахождения площади — формулу [latex]a\cdot b/2[/latex]. Код программы
Задача. Известна длина окружности. Найти площадь круга, ограниченного этой окружностью.
Тесты
Длина окружности
Точность
Результат работы программы
0
3
Невозможно выполнить для вырожденной окружности
-1
8
Ошибка ввода данных
34
-5
Ошибка ввода данных
25
18
Вывод с заданной точностью невозможен. Максимально возможная точность 13
25
13
49.7359197162173
83
5
548.20920
113.42
3
1 023.692
12 345 678
3
Вывод с заданной точностью невозможен. Максимально возможная точность 1
12 345 678
1
12 128 861 224 697.9
1 000 000 000
0
Число содержит больше 15 значащих цифр. Точный вывод невозможен
Алгоритм
Перед нами была поставлена задача вычислить площадь круга при условии, что известна длина окружности. Так как в условии не оговорена точность вычислений, выводить результат будем с количеством знаков после запятой, которое задано пользователем.
Воспользовавшись данной формулой находим искомую величину. Однако реализуя вывод с заданной точностью, требуется проверить сможет ли используемый нами тип данных double его обеспечить. Принимая во внимание факт, что данный тип хранит не более чем [latex]15[/latex] значащих десятичных цифр осуществляем следующую последовательность действий:
Находим значение переменной possibleAccuracyкак разность между максимально возможным количеством значащих цифр (maxAccuracy = [latex]15[/latex]) и имеющемся в данном числе .
Отрицательное значение переменной possibleAccuracy сигнализирует о том, что найденная площадь круга превышает [latex] 10^{15} [/latex]. Следовательно, выводим предупреждение о том, что точный подсчет невозможен даже с нулевой точностью после запятой.
При условии, что запрашиваемая точность превышает максимальную, выводим уведомление и значение максимальной точности.
При ложности пункта 2 и 3, используя манипулятор setprecision, выводим нужное количество знаков.
Код программы:
C++
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
#include <iostream>
#include <iomanip>
#include <math.h>
usingnamespacestd;
constintmaxAccuracy=15;
intmain(){
doublecircumference,circleArea;
intgivenAccuracy,possibleAccuracy;// заданная пользователем и максимально возможная в данном случае точность соответственно
cin>>circumference>>givenAccuracy;
if(circumference==0)
cout<<"Невозможно выполнить для вырожденной окружности";// выведение уведомления, если задана вырожденная окружность
elseif(circumference<0||givenAccuracy<0){
cout<<"Ошибка ввода данных";// проверка введенных данных
Треугольник задается координатами своих вершин на плоскости : [latex]A(x_{1} , y_{2})[/latex] , [latex]B(x_{2} , y_{2})[/latex] , [latex]C(x_{3} , y_{3})[/latex] . Найти длину и основание высоты, опущенной из вершины A на сторону ВС.
Тесты
[latex]x_{А}[/latex]
[latex]y_{A}[/latex]
[latex]x_{B}[/latex]
[latex]y_{B}[/latex]
[latex]x_{C}[/latex]
[latex]y_{C}[/latex]
Основание ([latex]BC[/latex])
Высота[latex]h[/latex]
Комментарий
7
9
45
9
34
5
11
13
пройден
0.75
1
0.25
2
0.5
3
1
0
пройден
98
67
56
47
34
95
52
47
пройден
0
1
0
3
0
4
1
0
пройден
В четвертом примере имеем вырожденный треугольник, для которого площадь будет равна нулю , следовательно и высота так же равна 0
далее выполняем условие , что если сумма двух сторон меньше третей то треугольник не существует. Если же наоборот начинаем считать плащадь треугольника по формуле :