Obżartuchy SPOJ

0

Link do zadania>> https://pl.spoj.com/problems/GLUTTON/

#include <iostream>

using namespace std;

double obliczanie() {
	double n, m, wynik;
	cout << "podaj n (liczba zaproszonych obzartuchow <10.000)i m (liczba ciastek w jednym pudelku)" << endl;
	cin >> n >> m;
	cout << endl;
	cout << "Podaj czas jedzenia ciastka przez kolejnego obzartucha " << endl;
	double* czasy = new double[n];
	double* wynik1 = new double[n];
	for (int i = 0; i < n; i++) {
		cin >> czasy[i];
	}
	double iloscpudelek = 0;
	for (int i = 0; i < n; i++) {
		
		wynik= czasy[i] * m;
		cout << wynik << "  << czas na zjedzenie pelnego pudelka" << endl;
		wynik1[i] = 86400 / wynik;
		cout << wynik1[i] << " ile pudelek mozna zjesc w dzien" << endl;
		iloscpudelek = wynik1[i] + iloscpudelek;
		cout << "suma wynosi: " << iloscpudelek;
		
	}
	return (int)iloscpudelek;
}



int main() {

	int iletestow;
	cin >> iletestow;
	for (int i = 0; i < iletestow; i++)
	{
		obliczanie();
	}
	

}

wynik pokazuje poprawny 7.2, lecz nie da się kupić 7.2 pudełek, trzeba kupić ich 8.
jak to napisać? bo nie mam pomysłu? myslalem coś o modulo i rzutowaniu na int, ale nie daję rady

1

Nie wiem czy to wystarczy, ale zamień

return (int)iloscpudelek;

na

return (int)(iloscpudelek + 0.5);
0

Spróbuj tej funkcji: std::ceil
https://en.cppreference.com/w/cpp/numeric/math/ceil

Ona Ci podaną liczbę zmiennoprzecinkową zaokrągla do wyższej wartości, która jest liczbą całkowitą. Czyli:
std::ceil(+7,2) zwróci 8.

0

output jest 7.2, nawet jak zmienilem

3

Żadnych double, musisz znaleźć liczbę wszystkich ciastek jakie zjedzą obżartuchy; w pętli, po ich ilości, dla każdego podzielić liczbę sekund doby przez czas (w sekundach), w jakim obżartuch zjada ciastko bez reszty, np:

    int div(int a, int b) {
       return (int) (a / b);
     }

Uzyskaną liczbę ciastek podzielić z resztą przez liczbę ciastek w pudełku, gdy reszta wieksza od zera dodać jeden do wyniku.

2

Podstawowy błąd początkującego na SPOJ:
wypisywanie zachęt użytkownika, które nie są opisane w treści zadania.
Rozwiązanie ocenia maszyna nie człowiek, więc wypisywać masz tylko to co jest dokładnie opisane w treści.

0
#include <iostream>

using namespace std;

double obliczanie() {
	double n, m, wynik;
	cout << "podaj n (liczba zaproszonych obzartuchow <10.000)i m (liczba ciastek w jednym pudelku)" << endl;
	cin >> n >> m;
	cout << endl;
	cout << "Podaj czas jedzenia ciastka przez kolejnego obzartucha " << endl;
	double* czasy = new double[n];
	double* wynik1 = new double[n];
	for (int i = 0; i < n; i++) {
		cin >> czasy[i];
	}
	double iloscpudelek = 0;
	for (int i = 0; i < n; i++) {
		
		wynik= czasy[i] * m;
		cout << wynik << "  << czas na zjedzenie pelnego pudelka" << endl;
		wynik1[i] = 86400 / wynik;
		cout << wynik1[i] << " ile pudelek mozna zjesc w dzien" << endl;
		iloscpudelek = wynik1[i] + iloscpudelek;
		cout << "suma wynosi: " << iloscpudelek;
		
	}
	return ceil(iloscpudelek);
}



int main() {

	int iletestow;
	cin >> iletestow;
	for (int i = 0; i < iletestow; i++)
	{
		obliczanie();
	}
	

}

https://zapodaj.net/0ffed83f334a2.png.html
to jest output jaki dostaje, przy dodaniu tej funkcji ceil

1
#include <cstdio>
using namespace std;

int main()
  {
   unsigned T,N,M,X;
   unsigned long long sum;
   for(scanf("%u",&T);T--;printf("%llu\n",(sum+M-1)/M)) for(sum=0,scanf("%u%u",&N,&M);N--;sum+=24*60*60/X) scanf("%u",&X);
   return 0;
  }
0

ktos ma pomysł odnosnie tego zaokraglania?

0

Co zaokrąglać, podałem Ci algorytm rozwiązujący zadanie; powyżej jego implementacja.

0

ale ja go totalnie nie rozumiem, sam bym tego nie napisał, więc jaki sens by wklejać to na SPOJ?
chciałbym byś pomógł mi udoskonalić tak mój kod, by przy użyciu tego co już mam, ostateczny wynik był zaokrąglany

1

Spróbuj przepisać swoje rozwiązanie na nowo, według przepisu, który podałem; żadnych double i zaokrągleń, przejdzie, bo @_13th_Dragon przechodzi.

0

zamieniając każdego double na int, przy takim outpucie jak poprzednio https://zapodaj.net/0ffed83f334a2.png.html
da mi wynik 6 co jest totalnie błędne.

0
#include <iostream>
#include <cmath>


using namespace std;

double obliczanie() {
    double n, m, wynik;
    cout << "podaj n (liczba zaproszonych obzartuchow <10.000)i m (liczba ciastek w jednym pudelku)" << endl;
    cin >> n >> m;
    cout << endl;
    cout << "Podaj czas jedzenia ciastka przez kolejnego obzartucha " << endl;
    double* czasy = new double[n];
    double* wynik1 = new double[n];
    for (int i = 0; i < n; i++) {
        cin >> czasy[i];
    }
    double iloscpudelek = 0;
    for (int i = 0; i < n; i++) {

        wynik = czasy[i] * m;
        cout << wynik << "  << czas na zjedzenie pelnego pudelka" << endl;
        wynik1[i] = 86400 / wynik;
        cout << wynik1[i] << " ile pudelek mozna zjesc w dzien" << endl;
        iloscpudelek = wynik1[i] + iloscpudelek;
        cout << "suma wynosi: " << iloscpudelek << endl;

    }
    return ceil(iloscpudelek);
}

int main() {

    int iletestow;
    cin >> iletestow;
    for (int i = 0; i < iletestow; i++)
    {
        cout<<obliczanie();
    }

}

kod wygląda tak
output tak//zapodaj.net/0718a39a3ecb3.png.html
a powinno tak: https://pl.spoj.com/problems/GLUTTON/ w czym problem?

0

Po kiego ci ta tablica?
Którą na dodatek nie zwalniasz.

0

To zadanie jest dość czułe na zaokrąglanie, trzymaj

#include <iostream>
#include <math.h>

using namespace std;

int main()
{
    int testy = 0;
    cin >> testy;
    while (testy--)
    {
        int ile_las = 0, wpud = 0, wynik = 0;
        cin >> ile_las >> wpud;
        for (int i =0; i < ile_las;i++)
        {
            int czas = 0;
            cin >> czas;
            wynik = wynik + (86400 / czas);
        }
        cout << ceil(float(wynik) / float(wpud)) << "\n";
    }
    return 0;
}

0

nie chce gotowego rozwiazania, chce pomocy w rozbudowaniu wlasnego.

0

Tu nie chodzi o to żebyś kopiował kod od innych osób z forum, tylko przeanalizował co robi poprawny kod a czego nie robi twój

1

Taka ogólna uwaga się nasuwa: w zadaniach algorytmicznych bardzo nieczęsto użycie floatów/double ma sens, i gdy to się dzieje, to lepiej żebyś miał bardzo dobry powód.

0
#include <iostream>
#include <cmath>

using namespace std;

int obliczanie() {
    int n, m, wynik;
    cout << "podaj n (liczba zaproszonych obzartuchow <10.000)i m (liczba ciastek w jednym pudelku)" << endl;
    cin >> n >> m;
    cout << endl;
    cout << "Podaj czas jedzenia ciastka przez kolejnego obzartucha " << endl;
    int* czasy = new int[n];
    int* wynik1 = new int[n];
    for (int i = 0; i < n; i++) {
        cin >> czasy[i];
    }
    double iloscpudelek = 0;
    for (int i = 0; i < n; i++) {

        wynik = czasy[i] * m;
        cout << wynik << "  << czas na zjedzenie pelnego pudelka" << endl;
        wynik1[i] = 86400 / wynik;
        cout << wynik1[i] << " ile pudelek mozna zjesc w dzien" << endl;
        iloscpudelek = wynik1[i] + iloscpudelek;
        cout << "suma wynosi: " << iloscpudelek << endl;

    }
    return ceil(iloscpudelek);
}

int main() {

    int iletestow;
    cin >> iletestow;
    for (int i = 0; i < iletestow; i++)
    {
        cout << obliczanie();
    }

}

zmienilem wszystkie double,floaty na inty, jak powiedziales
output to 6 dla danych :2,10 3600 1800 (czyli takich jak ostatnio)
a prawidlowo powinno byc: 7,2 czyli 8 pudelek

0

Zeby to policzyć, gdzies musi być modulo, inaczej nie distaniesz dobrego wyniku.

0
#include <iostream>
#include <cmath>

using namespace std;

double obliczanie() {
    double n, m, wynik;
    
    cin >> n >> m;
    
    double* czasy = new double[n];
    double* wynik1 = new double[n];
    for (int i = 0; i < n; i++) {
        cin >> czasy[i];
    }
    double iloscpudelek = 0;
    for (int i = 0; i < n; i++) {

        wynik = czasy[i] * m;
       
        wynik1[i] = 86400 / wynik;
    
        iloscpudelek = wynik1[i] + iloscpudelek;
       

    }
    return ceil(iloscpudelek);
}

int main() {

    int iletestow;
    cin >> iletestow;
    for (int i = 0; i < iletestow; i++)
    {
        cout << obliczanie();
    }

}

dla takich danych wejsciowych:
3 356
123
32999
10101

u mnie ouput to 3
poprawny output to 2

nie rozumiem w ktorym miejscu to modulo mialoby sie znajdowac? przy wydaniu wyniku i mialoby sprawdzac czy wynik jest liczba po przecinku?

0

Żadnych double, unsigned long long dla pewności. Gdzie modulo? Jak już Masz juz liczbę ciastek jakie zjedzą obżartuchy, to musisz podzielić ją przez liczbę ciastek w pudełku; ale gdy jest z tego dzielenia reszta, trzeba dodać jeszcze pudełko (żeby nie brakło).

0
#include <iostream>
#include <cmath>

using namespace std;

unsigned long long obliczanie() {
    unsigned long long  n, m, wynik;

    cin >> n >> m;

    unsigned long long* czasy = new unsigned long long[n];
    unsigned long long* wynik1 = new unsigned long long[n];
    for (int i = 0; i < n; i++) {
        cin >> czasy[i];
    }
    unsigned long long  iloscpudelek = 0;
    for (int i = 0; i < n; i++) {

        wynik = czasy[i] * m; // ile sekund na cale pudelko?

        wynik1[i] = (double)(86400 / wynik);  // ile pudelek w dzien?
        if (86400 % wynik != 0) {
            iloscpudelek = iloscpudelek + 1;
        }
       

        iloscpudelek = wynik1[i] + iloscpudelek; 

    }
    return ceil(iloscpudelek);
}

int main() {

    int iletestow;
    cin >> iletestow;
    for (int i = 0; i < iletestow; i++)
    {
        cout << obliczanie();
    }

}

tak zmodyfikowalem, wydaje sie ze wartosci wychodza dobre, jednak spoj nie przyjmuje

3

Po co tutaj te wszystkie dynamiczne tablice? Fuj.

Kod jest mało czytelny, ale mam wrażenie że przez uparte dążenie do bezsensownego tablicowania wszystkiego zapędziłeś się w błędną interpretację zadania. Jeśli jeden obżartuch zje 5 ciastek, a drugi 4, a pudełko ma 10, to wystarczy jedno pudełko, nie potrzeba dwóch.

Potraktuj sobie to rozwiązanie jako referencyjne:

int main()
{
	std::ios_base::sync_with_stdio(false);
	size_t testcases;
	std::cin >> testcases;
	for(size_t i{}; i < testcases; ++i){
		int gluttons, box_size;
		std::cin >> gluttons >> box_size;
		int total{};
		for(size_t j{}; j < gluttons; j++){
			int s;
			std::cin >> s;
			total += 86400/s;
		}
		int out = (total + box_size - 1)/box_size;
		std::cout << out << '\n';
	}
}
0

ja tylko prosze o podpowiedzi odnosnie mojego kodu, jesli znalbym i rozumialbym lepsze rozwiazania to napisalbym to inaczej, niestety to jest dla mnie najbardziej zrozumiale, niestety jesli chodzi o te zadanie
po prostu jest blad bo liczy dobrze, ale mam problem z tym zaokraglaniem

3

To może postaraj się zrozumieć poprawne rozwiązania? Masz błąd, bo źle liczysz. Przykładowo, dla danych 1 2 10 15700 15700 program powinien wypluć 1, a nie 2. Powinien się też w ogóle skompilować.

I nie stosuj tablic jak nie musisz. A jak musisz (a nie musisz) to koniecznie używaj std::vector zamiast new[].

1

@crypton: Ok o ile dobrze pamiętam to obliczanie ilości pudełek musi być tak jak ja to zrobiłem czyli z rzutowaniem na float-y bo inaczej sędzie na puści (testy były robione pod "floatowe" przybliżenia). Być może istnieje więcej takich "musi być dokładnie w ten sposób"), ale nie jestem aktywnym użytkownikiem spoj-a od dłuższego czasu. Ale pamiętam że to jedno z tych zadań w których trzeba pewne rzeczy zrobić w ściśle określony sposób. Dlatego dałem zatwierdzony kod. Generalnie czytaj komentarze pod zadaniami oraz wątki na forum spoj-a o takowym, czasem można tam znaleźć dodatkowe wymagania których nie ma w treści zadania.

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