пʼятниця, 6 березня 2015 р.

Heights

(Джерело: http://www.olymp.vinnica.ua/index_ua.php?lng=ua&cid=111)

Задача. Дано сторони трикутника а, b, с. Знайти висоти трикутника, радіуси вписаного та описаного кіл.

Вхідні дані. Ви вводите з клавіатури три дійсних числа а, b, с.
Вихідні дані. Ви виводите на екран п’ять дійсних чисел з трьома знаками після коми (без округлення).

Приклад вхідних і вихідних даних.
Введення: 23.000 34.000 43.000
Виведення: 33.813 22.873 18.086 21.619 7.777
Розв'язання.
Запишемо алгоритми мовами програмування.

Free Pascal:
Var a, b, c, p,
    Ha, Hb, Hc,
      S, r0, R : Real;
Begin
 Read (a, b, c);
 p := (a+b+c)/2;
 S := Sqrt (p*(p-a)*(p-b)*(p-c));
 Ha := 2*S/a;
 Hb := 2*S/b;
 Hc := 2*S/c;
 r0 := S/p;
 R := 0.25*a*b*c/S;
 Write (Ha:0:3, ' ', Hb:0:3, ' ', Hc:0:3, ' ', R:0:3, ' ', r0:0:3);
End.

C++:
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main(){
 double a, b, c;
 cin >>a >>b >>c;
 double p=(a+b+c)/2;
 double s=sqrt(p*(p-a)*(p-b)*(p-c));
 double ha=2*s/a, hb=2*s/b, hc=2*s/c;
 double R=0.25*a*b*c/s, r=s/p;
 cout.setf(ios::fixed);
 cout <<setprecision(3) <<ha <<' ' <<hb <<' ' <<hc <<' ' <<R <<' ' <<r;
}

четвер, 5 березня 2015 р.

Circle2

(Джерело: http://www.olymp.vinnica.ua/index_ua.php?lng=ua&cid=110) 

Задача. Дано довжину кола. Визначити площу круга, обмеженого цим колом.

Вхідні дані. Ви вводите з клавіатури одне дійсне число.
Вихідні дані. Ви виводите на екран одне дійсне число з трьома знаками після коми (без округлення).

Приклад вхідних і вихідних даних.
Введення: 12
Виведення: 11.459
Розв'язання.
Запишемо алгоритми мовами програмування.

Free Pascal:
Var L : Real;
Begin
 Read (L);
 L := Pi*Sqr(L/2/Pi);
 Write (L:0:3);
End.

C++:
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main(){
 double l;
 cin >> l;
 cout.setf(ios::fixed);
 cout << setprecision(3) << M_PI*pow(l/M_PI/2,2);
}

середа, 4 березня 2015 р.

Pupil

(Джерело: http://www.olymp.vinnica.ua/index_ua.php?lng=ua&cid=109)

Задача. Учень-невдаха Сашко сів виконувати домашнє завдання і просидів за столом 2 години. З них х хвилин він чухав потилицю і дивився у вікно, у шукав у письмовому столі гумку, щоб стерти у підручнику з англійської мови карикатуру на свого товариша, на малювання якої він витратив перед цим z хвилин. Решту часу Сашко перекладав англійські слова. Скільки слів він встиг перекласти, якщо переклад одного слова у нього займав 5 хвилин?
Примітка. Використовувати цілочисельне ділення (команду div).

Вхідні дані. Ви вводите з клавіатури три цілих числа x, y, z.
Вихідні дані. Ви виводите на екран одне число – шукану кількість слів.

Приклад вхідних і вихідних даних.
Введення: 10 15 25
Виведення: 14
Розв'язання.
Запишемо алгоритми мовами програмування.

Free Pascal:
Var X, Y, Z : Integer;
Begin
 Read (X, Y, Z);
 Write ((120-X-Y-Z) div 5);
End.

C++:
#include <iostream>
using namespace std;
int main(){
 int x, y, z ;
 cin >> x >> y >> z;
 cout << (120-x-y-z)/5;
}

вівторок, 3 березня 2015 р.

Girls

(Джерело: http://www.olymp.vinnica.ua/index_ua.php?lng=ua&cid=108)

Задача. Якщо на одну шальку терезів посадити Даринку, яка важить n кг, і Тетянку, яка важить на 5 кг більше, а на іншу насипати m кг цукерок, то скільки кілограм цукерок доведеться з’їсти дівчаткам, щоб шальки терезів врівноважились?

Вхідні дані. Ви вводите з клавіатури два цілих числа n і m.
Вихідні дані. Ви виводите на екран одне шукане число.

Приклад вхідних і вихідних даних.
Введення: 40 89
Виведення: 4
Розв'язання.
Запишемо алгоритми мовами програмування.

Free Pascal:
Var N, M : Integer;
Begin
 Read (N, M);
 Write (M-2*N-5);
End.

C++:
#include <iostream>
using namespace std;
int main(){
 int n, m ;
 cin >> n >> m;
 cout << m-2*n-5;
}

понеділок, 2 березня 2015 р.

Cube

(Джерело: http://www.olymp.vinnica.ua/index_ua.php?lng=ua&cid=107)

Задача. Дано довжину ребра куба. Знайти його об’єм та площу всієї поверхні.

Вхідні дані. Ви вводите з клавіатури одне ціле число.
Вихідні дані. Ви виводите на екран два цілих числа – об’єм та площу поверхні куба.

Приклад вхідних і вихідних даних.
Введення: 4
Виведення: 64 96
Розв'язання.
Запишемо алгоритми мовами програмування.

Free Pascal:
Var A : Integer;
Begin
 Read (A);
 Write (A*A*A, ' ', 6*A*A);
End.

C++:
#include <iostream>
using namespace std;
int main(){
 int a;
 cin >> a;
 cout << a*a*a << ' ' << 6*a*a;
}

пʼятниця, 27 лютого 2015 р.

NewCircle

(Джерело: http://www.olymp.vinnica.ua/index_ua.php?lng=ua&cid=106)

Задача. Дано  послідовність  цілих чисел.  Відрізок послідовності утворюють числа, що йдуть в послідовності підряд в порядку зростання. Знайти номери чисел, якими починається і закінчується  перший відрізок з максимальною сумою, а також цю суму.  

Технічні умови. Програма читає спочатку кількість елементів послідовності, а потім саму цю послідовність. Всі числа в одному рядку, їх розділено пропусками. Гарантовано, що послідовність не порожня, і всі розрахунки можна вести в межах типу longint. Програма виводить  в один рядок 3 числа через пропуск - номера першого і останнього елемента шуканого відрізка і суму чисел відрізку. 

Приклади.

Введення 3 -2 -1 0
Виведення 3 3 0

Введення 5 1 2 -3 3 0
Виведення 1 2 3
Розв'язання.*
З послідовності (P[N]) будемо послідовно виділяти відрізки починаючи з 1-го елемента та знаходитемо їх суму (Vs), яку будемо порівнювати з максимальною (Ms) та зберігатимемо початок (Mb) і кінець (Me) відрізка з максимальною сумою.
Запишемо алгоритми мовами програмування.

Free Pascal:
Var Mb, Me,
   N, I, J : 1..50;
    Ms, Vs : Integer;
         P : Array [1..50] Of Integer;
Begin
 Read (N);
 For I := 1 To N Do
  Read(P[I]);
 Mb := 1;
 Me := 1;
 Ms := P[1];
 For I :=1 To N Do Begin
  Vs := P[I];
  For J := I+1 To N+1 Do Begin
   If Vs > Ms
    Then Begin
     Mb := I;
     Me := J-1;
     Ms := Vs;
    End;
   If (P[J] > P[J-1]) And (J <= N)
    Then Vs += P[J]
    Else Break;
  End;
 End;
 Write(Mb, ' ', Me, ' ', Ms);
End.

C++:
#include <iostream>
using namespace std;
int main(){
 int n;
 cin >> n;
 int p[n];
 for (int i=0; i<n; i++)
  cin >> p[i];
 int mb=0, me=0, ms=p[0];
 for (int i=0; i<n; i++){
  int vs=p[i];
  for (int j=i+1; j<n+1; j++){
   if (vs>ms){
    mb=i;
    me=j-1;
    ms=vs;
   };
   if ((p[j]>p[j-1])&&(j<n))
    vs+=p[j];
    else break;
  }
 }
 cout << mb+1 << ' ' << me+1 << ' ' << ms;
}

* Розв'язання, на мою думку вірне, але проходить 9 з 10 тестів.

четвер, 26 лютого 2015 р.

Brackets

(Джерело: http://www.olymp.vinnica.ua/index_ua.php?lng=ua&cid=105)

Задача. Дано алгебраїчний вираз з дужками, записаний одним рядком. Вірно чи не вірно в ньому розставлено дужки?

Технічні умови. Програма читає  з клавіатури рядок з виразом (не довший за 255 символів). Програма виводить на екран відповідь у вигляді текстового рядка. Якщо дужки розставлено вірно - друкує слово True, якщо не вірно - False.

Приклад.
Введення:
(a+b)
Виведення:
True
Розв'язання.
У виразі вірно розставлено дужки, якщо кількість відкритих дорівнює кількості закритих і закрита не зустрічається раніше за відкриту. Отже, резервуємо змінну К, яку будемо збільшувати на 1 при зустрічі '('  і відповідно зменшуватимемо при зустрічі ')', та слідкуватимемо щоб К не стало від'ємним (K<0 - ')' зустрічається раніше за '(').
Запишемо алгоритми мовами програмування.

Free Pascal:
Var R : String[255];
    K, I : Integer;
Begin
 Read (R);
 K := 0;
 For I :=1 To Length (R) Do Begin
  Case R[I] Of
   '(' : Inc (K);
   ')' : Dec (K);
  End;
  If K < 0
   Then Break;
 End;
 Write (K = 0);
End.

C++:*
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
 char r[256];
 cin >> r;
 int k=0;
 for (int i=0; i<strlen(r); i++) {
  switch (r[i]) {
   case '(' : k++; break;
   case ')' : k--; break;
  }
  if (k<0) break;
 }
 std::cout << std::boolalpha;
 std::cout << (bool)!k;
}

* Розв'язання, на мою думку вірне, але не проходить жодного тесту....