Informatică, întrebare adresată de BrainlyUserBTW, 8 ani în urmă

Felinare (clasa a 5-a)
Piaţa centrală a oraşului Bacău are formă circulară. De jur împrejurul pieţei au fost montate n felinare numerotate de la 0 la n-1. Fiecare felinar poate avea două stări: aprins sau stins. Seara, toate felinarele se aprind simultan. Turistul Vasile T. Popescu începe să se plimbe de jur împrejurul pieţei, pornind de la felinarul 0 spre felinarul 1, apoi de la 1 spre 2, ..., de la n-2 spre n-1, de la n-1 spre 0 etc, iar atunci când trece pe lângă un felinar, el execută exact una dintre următoarele operaţii:

dacă felinarul precedent (i-1 dacă i > 0 sau n - 1 dacă i = 0) este aprins, atunci schimbă starea felinarului curent (dacă era aprins îl stinge, dacă era stins îl aprinde);
dacă felinarul precedent este stins, atunci starea felinarului curent rămâne neschimbată.
Cerinţă
Determinaţi numărul minim de operaţii pe care trebuie să le execute turistul nostru până când felinarele sunt aprinse din nou toate.

Date de intrare
Fişierul de intrare felinare.in conţine pe prima linie numărul natural n reprezentând numărul de felinare.

Date de ieşire
Fişierul de ieşire felinare.out va conţine o singură linie pe care va fi scris un singur număr natural reprezentând numărul minim de operaţii ce trebuie să fie executate pentru ca toate felinarele să fie din nou aprinse.

Restricţii
2 ≤ n ≤ 5000
n este de forma 2k sau 2k+1
Turistul stinge cel puţin un felinar.


BrainlyUserBTW: Dau coroana!!!

Răspunsuri la întrebare

Răspuns de andrei750238
0

#include <cstring>

#include <fstream>

using namespace std;

ifstream f("felinare.in");

ofstream g("felinare.out");

int main(){

   bool v[5000];

   int n,i;

   f >> n;

   //Pornire felinare

   for(i=0;i<n;i++) v[i]=1;

   //Simulare

   bool ok=1;

   int pasi=0;

   while(ok==1){

       pasi++;

       //Caz special : Felinar #0

       if(pasi%n==0){

           if(v[n-1]) v[pasi%n] = !v[pasi%n];

       }

       //Caz obisnuit : Felinar != 0

       else {

           if(v[pasi%n-1]) v[pasi%n] = !v[pasi%n];

       }

       //Verificare solutie

       ok=0;

       for(int j=0;j<n;j++){

           if(!v[j]) ok=1;

       }

   }

   //Scriere rezultat

   g <<  pasi;

}

Alte întrebări interesante