Problematyczne zadanie i problem z pętlą.

0

Dobry wieczór, mam problem(znowu) chodzi o zadanie:

Adrian postanowił wyciskać piwa na klatę. Adrian zaczyna od najmniejszego możliwego ciężaru i idzie stopniowo w górę, idąc zawsze do pierwszego większego ciężaru. Zastanawia się teraz, ile różnych ciężarów uda mu się wycisnąć zanim osiągnie ciężar maksymalny. Adrian nie może przenosić piw z jednego browaru do drugiego. W każdym browarze wystarczy mu piw na osiągnięcie celu.

Wejście
W jedynej linii wejścia znajdują się trzy liczby całkowite: ** a,b,n** będące odpowiednio wagą piw w pierwszym browarze, wagą piw w drugim browarze oraz ciężaru docelowego Adriana.

Wyjście
W jedynej linii wyjścia powinna znaleźć się jedna liczba całkowita, będąca liczbą różnych ciężarów, które wyciśnie Adrian.
Przykład
Dla danych wejściowych:

5 7 15
poprawną odpowiedzią jest:

5

Wyjaśnienie: Adrian wyciska 5 w pierwszym browarze, 7 w drugim, 10 w pierwszym, 14 w drugim i 15 w pierwszym.

Kod jest taki:

#include <iostream>

using namespace std;

int main()
{
    int a,b,n;
    int apo=a,bpo=b;
    bool czyjuz = false;

    cin >> a >> b >> n;

    for(int i =1;czyjuz==false;i++){
        if(a%i==0 && a%n==0){
            if(a!=n){
                a=apo+a;}
            else{
                czyjuz = true;
                cout << i;}
        }
        if(b%i==0 && b%n==0){
            if(b!=n){
                b=bpo+b;}
            else{
                czyjuz = true;
                cout << i;}
        }

    }
return 0;
}

Jednak ten tutaj kod nie działa, a nie mam pojęcia o co chodzi w programach do debbugowania, więc proszę was o pomoc :).

2

Po kiego ci ta pętla?

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    int a,b,n;
    cin>>a>>b>>n;
    //cout<<ceil(0.5*(3+2*a-2*b+sqrt(pow(-1-2*a+2*b,2)-4*(2*a-2*n))));
    cout<<ceil(0.5*(3+2*(a-b)+sqrt(pow(2*(b-a)-1,2)+8*(n-a))))<<endl; // uproszczono powyższe
    return 0;
}
0

@_13th_Dragon:
Dla danych: 5, 7, 21, poprawną odpowiedzia jest 6, powyższy kod daje 8.

1

Zadanie wydaje się proste, ale jednak trzeba troszkę pokombinować z warunkami brzegowymi:
https://godbolt.org/z/8bT6a7

int adrianasRounds(int a, int b, int n)
{
    if (a > b) {
        return 2 * (n / a) - (n % a <= n % b);
    } else if (a == b) {
        return n / a;
    }
    return 2 * (n / b) + (n % a < n % b);
}
0

@MarekR22: ten kod działa dla zadania

#include <iostream>

using namespace std;
int wynik,cel,a,b;
int NWD(int a,int b){
    if(a%b==0)return b;
    return NWD(b,a%b);
}
int main()
{
    cin >> a>>b>>cel;
    wynik = cel/a + cel/b - cel/(a*b/NWD(a, b));
    cout  << wynik;
return 0;
}
1

@KomnatoMan: źle zrozumiałem treść zadania.
Też zaliczyłem to zadanie.

int adrianasRounds(int a, int b, int n)
{
    if (a == b) {
        return n / a;
    }
    return n/a + n/b - n / std::lcm(a, b);
}

Moja pierwotna interpretacja jest ciekawsza (za każdym razem trzeba zmienić browar i zawsze zacząć od pierwszego).

0

@MarekR22: Jest jeszcze zadanie "Manipulacja rankingu" jakbyś mógł powiedzieć co zrobić żeby działał, ale metodami dla poziomu zaawansowania -1000

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    ios_base::sync_with_stdio(0);
    int n,m,wynik;
    bool better;
    int lepszych=1;

    cin >>n >> m;
    vector <int> pktD(m);
    for(int i =0;i<pktD.size();i++){
        cin >> pktD[i];}

    for(int i = 1 ; i<n ; i++){
        better = true;
        for(int z = 0; z<m ; z++){
            cin >> wynik;
            if(wynik!=100 && pktD[z]==100){
                better = false;}
        if(better == true){
            lepszych++;}
        }
    }
    cout << 1 << " " << lepszych;

    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1