👤
a fost răspuns

Buna ziua! Am si eu o problema la informatica, am rezolvat-o, dar cand incerc sa o rulez in C++ nu merge si nu stiu unde am gresit. Problema este:
Sunt N tarcuri cu oi. Pentru fiecare dintre cele N țarcuri se cunoaște numărul Oi de oi din el. În fiecare noapte, din motive necunoscute, extratereștrii fie pot răpi TOATE oile dintr-un țarc, fie EXACT O OAIE din fiecare țarc în care mai există cel puțin o oaie. Nea Gigi, programator vestit și oier păgubit, se întreabă, speriat, care este numărul MINIM
de nopți în care extratereștrii îi vor putea fura TOATE oile.
Cerință
Scrieți un program care să-l ajute pe Nea Gigi să calculeze numărul MINIM de nopți în care extratereștrii îi vor putea fura TOATE oile în modul descris în enunțul problemei.
Date de intrare
Programul va citi de la tastatură, numărul natural N reprezentând numărul de țarcuri din ferma lui Nea Gigi, urmat de N numere naturale Oi(unde i ia valori de la 1 la N), fiecare număr reprezentând numărul de oi din țarcul cu indicele i.
Date de ieșire
Pe ecran se va afișa un număr natural reprezentând numărul MINIM de nopți în care extratereștrii pot răpi TOATE oile de la ferma lui Nea Gigi în modul descris în enunțul problemei.
Restricții și precizări
 1 ≤ N ≤ 100000
 1 ≤ Oi ≤ 100000, pentru orice indice i cuprins între 1 și N
 Se garantează faptul că niciodată nu vor apărea alte oi în ferma lui Nea Gigi și nici nu vor dispărea altfel decât
răpite noaptea de extratereștri.

Exemplu: Daca se citesc 4 (nr tarcuri) si 1, 10, 2, 2 (nr oi) se va afisa 3 (zile) - in prima zi se fura cate o oaie din fiecare tarc (0,9,1,1), in a doua zi se fura toate oile din al doilea tarc (0,0,1,1) si in a treia zi se fura cate o oaie din tarcurile 3 si 4.

#include
using namespace std;
int v[100];
int tarc (int n)
{
int i,k,p,ok;
k=0;
p=0;
ok=0;
while (ok==0)
{
for (i=0; i if (v[i]!=0)
p++;

if (p==1)
{
k++;
ok=1;
}
if (p>1)
for (i=0; i {if(v[i]>0)
v[i]=v[i]-1;
k++;
}
}
return k;
}
int main()
{int n, i,k;
cin>>n;
for(i=0; i cin>>v[i];
k=tarc(n);
cout< return 0;
}


Răspuns :

Am rescris programul, daca ai nelamuriri lasa-le mai jos.


// daca se cunoaste ca in vectorul de tarcuri exista cel putin un tarc cu fix o oaie, atunci

// se scade 1 din fiecare element al vectorului, altfel se scade un tarc intreg care are

// valoarea mai mare decat 1

#include <iostream>

using namespace std;

int v[100], tarcCuOOaie;

int tarc (int n) {

   int i,zile=0,ok=0,tarcCuOOaieLocal;

   while (ok==0) {

       tarcCuOOaieLocal=0;

       if(tarcCuOOaie==1) {

           for(i=1; i<=n; i++) {

               if(v[i]>0) v[i]--;

               if(v[i]==1) tarcCuOOaieLocal=1;

           }

           tarcCuOOaie=tarcCuOOaieLocal;

           zile++;

       }

       else {

           i=0;

           do {

               v[i++];

           }

           while(v[i]<=1);

           v[i]=0;

           zile++;

       }

       for(i=1; i<=n; i++)

           if(v[i]!=0) {ok=0; break;}

           else ok=1;

   }

   return zile;

}

int main() {

   int n,i;

   cin>>n;

   for(i=1; i<=n; i++) {

       cin>>v[i];

       if(v[i]==1) tarcCuOOaie=1;

   }

   cout<<tarc(n);

   return 0;

}