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

Federinik

Nuovo Utente
86
14
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;
    }
}
Post unito automaticamente:

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.png
    Schermata 2020-07-18 18:38:54.png
    56.9 KB · Visualizzazioni: 174
Ultima modifica:

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
  • Mi piace
Reazioni: Mursey e Federinik

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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. ;)
 

Federinik

Nuovo Utente
86
14
@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:

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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).
 
  • Mi piace
Reazioni: Federinik

Federinik

Nuovo Utente
86
14
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...
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili