• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Informatyka-programowanie

Object Storage Arubacloud
0 głosów
386 wizyt
pytanie zadane 24 marca 2019 w C i C++ przez Lucyfer1234 Początkujący (440 p.)

Mam problem . Mianowicie chciałbym żeby dany program działał dla kilku liczb(tyle ile poda użytkownik).Niestety nie umiem tego zrobić.Oto treść zadania:

Wejście :W pierwszej linii wejścia znajsuje się liczba n (1 ¬ n ¬ 100) oznaczająca liczbę nominałów w kasie. W kolejnych n liniach znajdują się ich opisy w postaci liczb wi i li oznaczające, że w kasie znajduje się li nominałów o wartości wi (1 ¬ wi ¬ 104 ). Wartości wi na wejściu nie powtarzają się. W kolejnym wierszu wejścia znajduje się liczba q - liczba zapytań. Następnie w q wierszach są zapytania w postaci liczby x (0 ¬ x ¬ 104 ).

Wyjście: Na wyjście wypisz q linii - w i-tej z nich odpowiedź na i-te zapytanie, tj. TAK, jeżeli kwotę x da się wydać za pomocą dostępnych banknotów, NIE w przeciwnym wypadku.

Oto mój kod:

#include <iostream>
#include <list>
using namespace std;
list <int> lista;
list <int> lista2;

void pop_front()
{
    lista.pop_front();
}

int main()
{
    int ilosc_nominalow,wartosc,liczba_testow,liczba,liczba_nominalow;
    cin>>ilosc_nominalow;
    for(int i=0; i<ilosc_nominalow; i++)
    {
        int wartosc;
        cin>>liczba_nominalow;
        lista2.push_front(liczba_nominalow);
        cin>>wartosc;
        lista.push_front(wartosc);
    }
    lista.sort();
    lista.reverse();
    lista2.sort();
        int suma=0;
        cin>>liczba;
        suma=liczba;
        for(int j=0; j<ilosc_nominalow; j++)
        {
            while(lista2.front()>0)
            {
                suma=suma-lista.front();
              lista2.front()--;
                if(suma==0)
                {
                    cout<<"TAK"<<endl;
                    return 0;
                }
            }
            pop_front();
            lista2.pop_front();
        }
        if(suma!=0) cout<<"NIE"<<endl;
           
    return 0;
}


 

1 odpowiedź

0 głosów
odpowiedź 24 marca 2019 przez Mateusz Pawlak Użytkownik (960 p.)
edycja 24 marca 2019 przez Mateusz Pawlak

Czy twój kod działa dla pojedyńczej liczby? I jak dobrze rozumiem to zmienna 'liczba' ma przechowywać ile liczb podał użytkownik?

 

EDIT:

Kod powinien wygladac mniej wiecej tak:

//podaj ilosc kwot do sprawdzenia
int ilosc = podana wartosc
int zmiennaPomocnicza=0; 

for(int i =0 ; i < ilosc ; i++)
{
	for(int k = 0; k< ilosc_nominalow; k++)   
	{
		zmiennaPomocnicza=0;

		for(int j = 0; j < lista.front() ; j++)
		{
			if((kwota-(i * lista2.front()) >0)
				zmiennaPomocnicza=i;
		}

		kwota -= zmiennaPomocnicza * nominał;

		lista.front()--;
		lista2.front()--;

	}

	if(kwota ==0)
		cout << "TAK" << endl;

	else
		cout << "NIE" << endl;
}

Jedyny problem jaki widzę to to że sortując obie listy mieszasz wczesniej powiązana wartość nominału z jego ilością w kasie. Ja bym to zrobił tak żeby wprowadając wartość wymusić wpisanie większego nominału od poprzedniego. np:

for(int i=0; i<ilosc_nominalow; i++)
    {
        int wartosc;
	cin>>liczba_nominalow;
        lista2.push_front(liczba_nominalow);
	do{
       		cin>>wartosc;
	}while(lista.front() > wartość)
       	lista.push_front(wartosc);
	
    }

i proponuje przed każdym "cin'em" zrobic cout'a z informacja jaką zmienną aktualnie wprowadzasz bo troche tego masz i mozna łatwo sie pomylic podczas testów.

Pozdrawiam

Podobne pytania

–4 głosów
1 odpowiedź 142 wizyt
pytanie zadane 23 października 2020 w C i C++ przez Fuszion74 Początkujący (310 p.)
–1 głos
0 odpowiedzi 197 wizyt
0 głosów
2 odpowiedzi 215 wizyt
pytanie zadane 24 marca 2019 w C i C++ przez Lucyfer1234 Początkujący (440 p.)

92,556 zapytań

141,404 odpowiedzi

319,560 komentarzy

61,942 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...