fbpx

Problema #1040 – Clepsidru – Rezolvari PBInfo

de Mihai-Alexandru

O clepsidră este un dispozitiv folosit pentru a măsura timpul. Clepsidra este alcătuită din două incinte de sticlă, conectate printr-un tub fin. Una dintre incinte este umplută cu nisip, acesta scurgându-se în cea de-a doua incintă, cu o viteză constantă. Clepsidra poate fi întoarsă, pentru a măsura o altă perioadă de timp.

Arheologii au descoperit un dispozitiv, pe care l-au denumit clepsidru, format din n clepsidre identice, suprapuse, numerotate de la 1 la n, prin care nisipul poate circula de la o clepsidră la alta datorită forţei gravitaţionale.

Studiind acest obiect, arheologii au constatat că :

  • dispozitivul poate fi utilizat atât în poziţia 1, când clepsidrele sunt în ordinea 1, 2 ,…, n cu clepsidra n aşezată pe sol, cât şi în poziţia 2, când clepsidrele sunt în ordinea n, n-1,…, 1 cu clepsidra 1 aşezată pe sol;
  • viteza de trecere a nisipului de la o incintă la alta, a aceleiaşi clepsidre, este de 1 bob de nisip/secundă, pentru toate clepsidrele, indiferent de poziţie;
  • trecerea clepsidrului dintr-o poziţie în alta presupune răsturnarea acestuia şi reaşezarea boabelor de nisip;
  • timpul de trecere a boabelor de nisip de la o clepsidră la alta este 0.

Arheologii studiază comportarea clepsidrului realizând două experimente diferite, după cum urmează:

a) Se aşează clepsidrul în poziţia 1, se introduc în incinta de sus a clepsidrei 1 un număr b de boabe de nisip şi se determină după câte secunde vor ajunge toate boabele de nisip în incinta de jos a ultimei clepsidre;

Exemplu

clepsidru.in

2 323 11 2

clepsidru.out

41 10 1

Explicație

  • Clepsidrul este format din n=2 clepsidre şi în incinta de sus a primei clepsidre se introduc b=3 boabe de nisip.
  • Toate boabele de nisip vor ajunge în incinta de jos a ultimei clepsidre după 4 secunde.
  • După ce clepsidrul este aşezat 3 secunde în poziţia 1 şi 1 secundă în poziţia 2, în clepsidre se vor găsi câte (1,1), (0,1) boabe de nisip.
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n,b,k,timp,p,ljos,lsup,a0=0,an=0;
    ifstream fin("clepsidru.in");
    ofstream fout("clepsidru.out");
    fin >> n >> b;
    fout << n + b - 1 <<'\n';
    ljos = a0 = an = 0;
    lsup = 1 - b;
    fin >> k;
    for (int i=1;i<=k; i++)
    {
        fin>>timp>>p;
        if (p==1)
        {
            if (lsup<n)
            {
                lsup += timp;
                ljos += timp;
                if (lsup>=n)
                {
                    lsup=n;
                    ljos=n+b-1;
                }
            }
        }
        else
        {
            if(ljos > 0)
            {
                ljos -=timp;
                lsup -=timp;
                if (ljos <=0)
                {
                    ljos = 0;
                    lsup=1-b;
                }

            }
        }

    }
    if (lsup <=0) a0 = 1-lsup;
    if (ljos >=n) an = ljos -n+1;
    fout << a0 << " ";
    for (int i =1;i<n; ++i)
        if ((i>=lsup ) && (i<=ljos))
            if (p==1) fout << "0\n1 ";
            else fout <<"1\n0 ";
        else  fout << "0\n0 ";
    fout << an << "\n";
    fin.close();
    fout.close();
    return 0;

}
Comentarii

S-ar putea sa iti placa