PROBLEMA [C++] Il mio programma non riesce a leggere l'input da terminale

Pubblicità

Federinik

Nuovo Utente
Messaggi
99
Reazioni
20
Punteggio
28
Buongiorno a tutti, ho un programma in c++ da svolgere, io ho trovato una soluzione, ma ho qualche problema nella lettura dell'input: se inserisco un numero alla volta funziona, ma se inserisco tutto in una volta sola, facendo il copia-incolla dal Sample, si blocca dopo il caso 2... (nel codice riga 58) e devo interrompere manualmente l'esecuzione.

Testo (in inglese, se serve lo traduco...):

Problem
There are N houses for sale. The i-th house costs Ai dollars to buy. You have a budget of B dollars to spend.
What is the maximum number of houses you can buy?

Input
The first line of the input gives the number of test cases, T. T test cases follow. Each test case begins with a single line containing the two integers N and B. The second line contains N integers. The i-th integer is Ai, the cost of the i-th house.

Output
For each test case, output one line containing Case #x: y, where x is the test case number (starting from 1) and y is the maximum number of houses you can buy.

Sample

Input

Output
3
4 100
20 90 40 90
4 50
30 30 10 10
3 300
999 999 999

Case #1: 2
Case #2: 3
Case #3: 0

In Sample Case #1, you have a budget of 100 dollars. You can buy the 1st and 3rd houses for 20 + 40 = 60 dollars.
In Sample Case #2, you have a budget of 50 dollars. You can buy the 1st, 3rd and 4th houses for 30 + 10 + 10 = 50 dollars.
In Sample Case #3, you have a budget of 300 dollars. You cannot buy any houses (so the answer is 0).

Soluzione da me svolta:
Codice:
#include <iostream>
using namespace std;

int* NewArray(int N)
{
    int* p;
    p= new int[N];
    return p;
}
int* Minimo (int *v, int N, int start)
{
    int j;
    int *p;
    p=NewArray(2);
    for(j=start;j<N;j++)
    {
        if(j==start)
        {
            p[0]=v[j];
            p[1]=j;
        }
        if(v[j]<p[0])
        {
            p[0]=v[j];
            p[1]=j;
        }
    }
    return p;
}
//Ordina un Array
void sortArray(int* v, int N)
{
    int t,k,pos;
    int *p;
    for(k=0;k<N;k++)
    {
        p=Minimo(v, N, k);
        t=v[k];
        v[k]=p[0];
        pos=p[1];
        v[pos]=t;
    }
}
int main()
{
    int T,N,B,j,k;
    int cont;
    int*p;
    cin>>T;
    for(j=0;j<T;j++)
    {
        cont=0;
        cin>>N;
        cin>>B;
        p=NewArray(N);
        for(k=0;k<N;k++)
        {
            cin>>p[k];  //qui il problema
        }
        sortArray(p,N);
        while(B>=0)
        {
        B=B-p[cont];
        cont++;
        }
        cout<<endl<<"Case #"<<j+1<<": "<<cont-1<<endl;
    }
}
--- i due messaggi sono stati uniti ---
Allora, copiando l'esempio intero da questa domanda, funziona!
Il testo del problema arriva da qui: https://codingcompetitions.withgoogle.com/kickstart/round/000000000019ffc7/00000000001d3f56
Se copio l'esempio dalla pagina del link non funziona, aiutatemi a capire...
 

Allegati

  • Schermata 2020-07-18 18:38:54.webp
    Schermata 2020-07-18 18:38:54.webp
    21.8 KB · Visualizzazioni: 174
Ultima modifica:
Nope,
Comunque non ho capito che problema hai avuto... intendi che hai copiato il codice dalla pagina e hai incollato? In tal caso è probabile tu abbia copiato un "new line" che è rimasto in stdin e che di conseguenza ti ha fatto "saltare" l'immissione da tastiera (in quanto è stato elaborato il new line che era rimasto).

Aggiungo alcuni suggerimenti comunque.
Può sembrare banale ma... le convenzioni: in maiuscolo vengono indicate le costanti, e non le variabili.
I nomi: "p", "v", "t", "k", "B"... per come sono utilizzati non hanno un significato, non si capisce che cosa rappresentano; meglio dare nomi esplicativi (a tal proposito: Come dare un nome alle variabili, scritto da Andretti).

L'allocazione dell'array puoi farla direttamente senza la funzione newArray(), o comunque almeno semplificarla:

C++:
int* NewArray(int N)
{
    return new int[N];
}

La funzione Minimo invece.

C++:
int* Minimo (int *v, int N, int start)
{
    int j;
    int *p;
    p=NewArray(2);
    for(j=start;j<N;j++)
    {
        if(j==start)
        {
            p[0]=v[j];
            p[1]=j;
        }
        if(v[j]<p[0])
        {
            p[0]=v[j];
            p[1]=j;
        }
    }
    return p;
}

j è il contatore, quindi dovresti dichiararlo nel for (la prima parte è infatti proprio l'inizializzazione); così limiti lo scope della variabile al solo ciclo.
p, non serve che dichiari la variabile e che definisci il valore dopo. Puoi fare tutto su una riga.
In merito all'algoritmo in sè, ti sei complicato la vita su una cosa semplice. Dai un occhio a counting sort, per vedere come migliorarlo (hint: https://www.programiz.com/dsa/counting-sort oltre a Wiki e alle altre risorse che puoi trovare).

Allocare ad ogni chiamata a Minimo di 2 int (nello heap) è inefficiente, inoltre non fai mai un free di tutto ciò che allochi (non è una buona pratica).

Sono alcuni consigli, poi... sta a te. ;)
 
@DispatchCode Grazie molte, sei stato davvero gentile a fornirmi tutti questi consigli.

Comunque non ho capito che problema hai avuto... intendi che hai copiato il codice dalla pagina e hai incollato? In tal caso è probabile tu abbia copiato un "new line" che è rimasto in stdin e che di conseguenza ti ha fatto "saltare" l'immissione da tastiera (in quanto è stato elaborato il new line che era rimasto).

Probabilmente deve essere dovuto a quello...

Aggiungo alcuni suggerimenti comunque.
Può sembrare banale ma... le convenzioni: in maiuscolo vengono indicate le costanti, e non le variabili.
I nomi: "p", "v", "t", "k", "B"... per come sono utilizzati non hanno un significato, non si capisce che cosa rappresentano; meglio dare nomi esplicativi (a tal proposito: Come dare un nome alle variabili, scritto da Andretti).

Terrò a mente questo suggerimento per il futuro, il mio problema è che al liceo ho seguito solo un corso base di programmazione in c e c++ e molti aspetti sono passati in secondo piano. Adesso all'università abbiamo svolto un altro corso dedicato all'analisi dati utilizzando delle particolari librerie (ROOT sviluppata dal cern), ma a causa dei tempi ristretti, non siamo mai andati in profondità.
Cercherò di ottimizzare il programma prendendo spunto dal link che mi hai fornito.
Siccome mi piace programmare, ho iniziato a cercare problemi su internet per fare pratica, ma del c++ conosco poco più che la sintassi di base, mi potreste consigliare qualche link o libro che spiega strategie di risoluzione?
Grazie ancora
 
Ultima modifica:
Di niente.
Se vuoi studiare C++ c'è il testo di Bjarne Stroustrup: rogramming: Principles and Practice Using C++ (è il creatore di C++).
Ce ne saranno sicuramente altri di validi, ma evito di farti nomi non essendo aggiornatissimo in merito.

Sul fatto dei ragionamenti, la logica etc: purtroppo è la parte più complicata, e l'unica cosa che puoi fare è tanta pratica.
Le strategie di risoluzione dipendono dal problema che devi affrontare, sta a te trovare quella migliore in rapporto al tuo problema.

Ci sono altre cose che puoi studiare, come i design patterns, ma se sei all'uni sono cose che vedrai sicuramente.
Diciamo che si tratta di allenare il modo in cui ragioni, e imparare a risolvere i problemi (dai un occhio al thread "imparare a programmare" se vuoi, ci sono in po' di consigli vari).
 
Di niente.
Se vuoi studiare C++ c'è il testo di Bjarne Stroustrup: rogramming: Principles and Practice Using C++ (è il creatore di C++).
Ce ne saranno sicuramente altri di validi, ma evito di farti nomi non essendo aggiornatissimo in merito.

Sul fatto dei ragionamenti, la logica etc: purtroppo è la parte più complicata, e l'unica cosa che puoi fare è tanta pratica.
Le strategie di risoluzione dipendono dal problema che devi affrontare, sta a te trovare quella migliore in rapporto al tuo problema.

Ci sono altre cose che puoi studiare, come i design patterns, ma se sei all'uni sono cose che vedrai sicuramente.
Diciamo che si tratta di allenare il modo in cui ragioni, e imparare a risolvere i problemi (dai un occhio al thread "imparare a programmare" se vuoi, ci sono in po' di consigli vari).
Sicuramente metterò il libro nella lista degli acquisti e continuerò a fare pratica, io sono iscritto alla facoltà di fisica, quindi programmazione non è tra i corsi principali... Però magari riesco a spiare qualche corso di informatica, oppure scovarne qualcuno su internet...
 
Pubblicità
Pubblicità
Indietro
Top