fbpx

Problema #1107 – Reflex – Rezolvari PBInfo

de Mihai-Alexandru

La un concurs de robotică, în timpul prezentării, un roboţel cu corp cilindric cu diametrul de o unitate scapă de sub control şi se deplasează într-un ring de formă dreptunghiulară. Ringul este împărţit în N x M pătrate identice, cu latura de o unitate, aşezate pe N linii şi M coloane.

Robotul poate părăsi ringul numai pe la colţuri, acestea fiind numerotate de la 1 la 4, colţul cu numărul 1 fiind cel din stânga jos apoi restul fiind numerotate în sens trigonometric. Suprafaţa ringului este delimitată de exterior prin intermediul a patru pereţi despărţitori: doi pereţi “verticali” (aşezaţi de la colţul 1 la colţul 4, respectiv de la colţul 2 la colţul 3) şi doi pereţi “orizontali” (aşezaţi de la colţul 1 la colţul 2, respectiv de la colţul 3 la colţul 4), fără a bloca ieşirile, ca în desenul alăturat.

Robotul pătrunde în ring prin colţul cu numărul 1 sub un unghi de 45 grade şi cu o viteză de un pătrat/s. Ciocnirile cu pereţii sunt considerate perfect elastice (robotul nu-şi pierde din viteză) iar unghiul de incidenţă este egal cu cel de reflexie.

Cerinţe

Se cere să se determine:

a) după câte secunde şi prin ce colţ al ringului va ieşi robotul;

La un concurs de robotică, în timpul prezentării, un roboţel cu corp cilindric cu diametrul de o unitate scapă de sub control şi se deplasează într-un ring de formă dreptunghiulară. Ringul este împărţit în N x M pătrate identice, cu latura de o unitate, aşezate pe N linii şi M coloane.

Robotul poate părăsi ringul numai pe la colţuri, acestea fiind numerotate de la 1 la 4, colţul cu numărul 1 fiind cel din stânga jos apoi restul fiind numerotate în sens trigonometric. Suprafaţa ringului este delimitată de exterior prin intermediul a patru pereţi despărţitori: doi pereţi “verticali” (aşezaţi de la colţul 1 la colţul 4, respectiv de la colţul 2 la colţul 3) şi doi pereţi “orizontali” (aşezaţi de la colţul 1 la colţul 2, respectiv de la colţul 3 la colţul 4), fără a bloca ieşirile, ca în desenul alăturat.

Robotul pătrunde în ring prin colţul cu numărul 1 sub un unghi de 45 grade şi cu o viteză de un pătrat/s. Ciocnirile cu pereţii sunt considerate perfect elastice (robotul nu-şi pierde din viteză) iar unghiul de incidenţă este egal cu cel de reflexie.

Cerinţe

Se cere să se determine:

a) după câte secunde şi prin ce colţ al ringului va ieşi robotul;
b) de câte ori se ciocneşte robotul de pereţii orizontali şi verticali, rezultând o schimbare de direcţie, până la ieşirea din ring.

Date de intrare

Fișierul de intrare reflex.in conține pe prima linie două numere naturale N şi M, separate printr-un singur spaţiu.

Date de ieșire

Fișierul de ieșire reflex.out va conține pe prima linie două numere naturale S și C, separate printr-un singur spațiu, S reprezentând numărul de secunde după care robotul va ieşi din ring, iar C reprezintă numărul colţului prin care acesta va ieşi. Pe a doua linie, fişierul de ieşire va conține două numere naturale H şi V, separate printr-un spaţiu, H reprezentând numărul de ciocniri cu pereţii orizontali ai ringului, iar V numărul de ciocniri cu pereţii verticali.

Restricții și precizări

  • 3 ≤ N, M ≤ 2 000 000 000
  • Pentru rezolvarea corectă a unei singure cerinţe se acordă 50% din punctaj, iar pentru rezolvarea corectă a ambelor cerinţe se acordă 100% din punctaj.

Exemplul 1

reflex.in

3 6

reflex.out

11 4
4 1

Explicație

Până la ieşire se parcurg 11 pătrate, ieşirea se produce pe la colţul 4. Se produc 4 ciocniri cu pereţii orizontali şi o ciocnire cu pereţii verticali.

Exemplul 2

reflex.in

5 7

reflex.out

13 4
2 1

Explicație

Se parcurg 13 pătrate, ieşirea se face la colţul 4 şi de produc 2 ciocniri cu pereţii orizontali (în punctele a şi c respectiv o ciocnire cu pereţii verticali în punctul b).

#include<fstream>
using namespace std;
ifstream cin("reflex.in");
ofstream cout("reflex.out");
long long a , b , s , c , x , y , r , a1 , b1;
int colt[3]={2 , 4 , 3};

int main()
{
    cin >> a >> b;
    a1 = a-1;
    b1 = b-1;
    while(b1!=0){r = a1 % b1; a1 = b1; b1 = r;}
    x = (b - 1) / a1;
    y = (a - 1) / a1;
    c = colt[y % 2 + (x % 2)*2 - 1];
    s = y * (b - 1);
    cout << s + 1 << " " << c << '\n' << x - 1 << " " << y - 1;
    return 0;
}
Comentarii

S-ar putea sa iti placa