Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Programma per la scuola
Forum - C/C++ - Programma per la scuola

Avatar
scribiuz (Member)
Newbie


Messaggi: 2
Iscritto: 28/07/2009

Segnala al moderatore
Postato alle 20:54
Venerdì, 26/11/2010
Descrizione del problema

Winnie Pooh ha appena trovato un immenso giacimento di miele che nemmeno il suo pancino goloso è in grado di contenere.

Ovviamente ha timore ad allontanarsi perchè crede che i giagulari potrebbero arrivare mentre lui non c’è e portarglielo via tutto.

Chiede allora aiuto ai piccoli amici della foresta (scoiattoli, uccellini, coccinelle,ecc.) perchè possano fare dei turni di guardia al giacimento di miele.

Siccome Winnie ha stimato che il miele durerà esattamente 365 giorni prima di finire ha bisogno di molti amici per tenere sempre qualcuno di guardia,

perchè non può certo pretendere che un solo amico gli pattugli il giacimento tutti e 365 i giorni.

Armato di carta e penna segna per ognuno dei suoi N amici il turno di guardia di d giorni consecutivi che può fare.

Ogni turno di guardia sul foglio di Pooh è segnato da un numero che indica il giorno iniziale (compreso) e il giorno finale (compreso) che l’amico può fare.

Ogni giorno è indicato con un numero compreso tra 1 e 365 e il giorno iniziale è sempre <= di quello finale.

Aiuta Pooh scrivendo un programma che dato in input il suo foglio stabilisca se i turni di guardia permettono di tenere i giagulari alla larga dal suo miele.

P.s. Si pensa che i giagulari non esistano, ma questo fatto non ha importanza perchè Winnie invece crede nella loro esistenza e ne ha paura.

Dati di input

Il file di input contiene un numero N che indica il numero di amici che si sono dati disponibili per fare i turni di guardia.

Le successive N righe contengono ognuna due interi, il primo dei quali rappresenta il giorno iniziale del turno e il secondo il giorno finale del turno.

Il giorno iniziale è sempre <= del giorno finale e i valori sono compresi tra 1 e 365. I turni possono ovviamente sovrapporsi.

Dati di output

Se i turni di guardia coprono tutti i 365 giorni il programma dovrà stampare la scritta SI seguita da un numero che indica

il numero massimo di amici presenti nello stesso giorno a fare la guardia (non interessa quale sia il giorno o i giorni,

ma solo quanti amici sono presenti contemporaneamente).

Se invece non è sempre possibile avere almeno un amico a guardia del miele il programma dovrà stampare

la scritta NO seguita dal numero di giorni in cui nessuno è di guardia al miele.

Esempi di input/output

File input.txt File output.txt

3               NO 16

12  33

20  210

165 360

File input.txt File output.txt

3              SI 3

27  333

1  210

180 365

C'è qualcuno che sa risolverlo io ci ho provato un casino di volte ma non riesco

PM
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Up
1
Down
V
Segnala al moderatore
Postato alle 21:17
Venerdì, 26/11/2010

il punto di partenza è il codice che hai scritto, ma non lo vedo...

PM
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Up
1
Down
V
Segnala al moderatore
Postato alle 18:41
Sabato, 27/11/2010
Crea un array di char con 365 elementi.

Setta tutti gli elementi a zero (bzero).

Per ogni linea dove i numeri sono X Y, vai un ciclo for che da X a Y incrementa di 1 l'elemento corrente.

Controlla che tutti gli elementi siano settati a un numero diverso da zero per vedere se i turni sono sufficienti a coprire l'anno. Prendi il numero magiore dell'array per vedere il numero massimo di amici che fanno la guardia nello stesso momento.

Ma il tuo codice dov'e'?

Ultima modifica effettuata da pierotofy il 27/11/2010 alle 18:44


Il mio blog: https://piero.dev
PM
Avatar
hackersitiz (Normal User)
Pro


Messaggi: 120
Iscritto: 29/09/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 11:22
Domenica, 28/11/2010
Testo quotato

Postato originariamente da pierotofy:

Crea un array di char con 365 elementi.

Setta tutti gli elementi a zero (bzero).

Per ogni linea dove i numeri sono X Y, vai un ciclo for che da X a Y incrementa di 1 l'elemento corrente.

Controlla che tutti gli elementi siano settati a un numero diverso da zero per vedere se i turni sono sufficienti a coprire l'anno. Prendi il numero magiore dell'array per vedere il numero massimo di amici che fanno la guardia nello stesso momento.

Ma il tuo codice dov'e'?



Bella spiegazione ... Comunque dovrebbe abbozzare qualche codice...
Se non sai da dove partire prendi come bozza la soluzione di Piero e sviluppa uno pseudocodice... Dopo aver fatto questo, prendi il tuo pseudocodice, che dovrebbe essere scritto in linguaggio normale e trasforma le paroline scritte in istruzioni e vedi che il codice viene... E' una roba banale , ma ti aiuta a ragionare ed è molto utile, anche per sviluppare una parte di un progetto...;)

Ultima modifica effettuata da hackersitiz il 28/11/2010 alle 11:27
PM
Avatar
scribiuz (Member)
Newbie


Messaggi: 2
Iscritto: 28/07/2009

Up
0
Down
V
Segnala al moderatore
Postato alle 20:41
Domenica, 28/11/2010
Ok ho fatto scusate se non ho messo il codice è la prima volta che posto una domanda cmq il codice corretto dovrebbe essere questo:

#include <stdio.h>
int main()
{
    int NAmici, i, j, gnncop=0, gnncop_temp=0, persmax=0, persmax_temp=0, giornocop=0;
    printf("Inserire il numero di amici: ");
    scanf("%d",&NAmici);
    //Dichiaro gli array
    int GiornoI[NAmici], GiornoF[NAmici];
    for(i=0; i<NAmici; i++)
    {
        scanf("%d%d",&GiornoI,&GiornoF);
    }
    //==================================
    //Controllo se tutto l'anno è coperto
    //==================================
    for(i=1; i<=365; i++) //Contiamo tutti i giorni
    {
        //Devo controllare se la i non è compresa in nessun intervallo
        for(j=0; j<NAmici; j++) //Gli array hanno elementi da 0 a NAmici
        {
           if( GiornoI[j]<= i && i <= GiornoF[j] )
           {
               giornocop++;
               break;
           }
        }
    }
    if(giornocop ==365)//Se tutti i giorni sono presi
    {
        printf("SI");
        //Ora devo controllare il numero massimo di persone nello stesso giorno
        for(i=1; i<=365; i++)
        {
            for(j=0; j<NAmici; j++)
            {
                if(GiornoI[j] <= i && i <= GiornoF[j])//Se la i (il giorno) è compresa allora ci saranno persone
                {
                    persmax_temp++;
                }
            }
            if(persmax_temp>persmax)
            {
                persmax=persmax_temp;
            }
            persmax_temp=0;
        }
        printf(" con max %d persone nello stesso giorno",persmax);
    }
    else
    {
        //Ora devo contare i giorni in cui non c'è nessuno --> gnncop (Giorni NN COPerti)
        for(i=1; i<=365; i++)
        {
            for(j=0; j<NAmici; j++)
            {
                if(i>GiornoF[j] || i<GiornoI[j])//La i non è compresa
                {
                    gnncop_temp++;
                }
            }
            if(gnncop_temp>=NAmici)//Così controllo se il giorno non è coperto
                
            {
                gnncop++;
            }
            gnncop_temp=0;
        }
        printf("NO con %d giorni non coperti",gnncop);
    }
    return 0;
}

Ultima modifica effettuata da scribiuz il 28/11/2010 alle 20:43
Quindi? Funziona o hai bisogni di ulteriore aiuto? - pierotofy - 28/11/10 21:26
Funziona grazie per i consigli precedenti mi sono serviti e scusate ancora per non aver pubblicato subito il sorgente. - scribiuz - 28/11/10 22:09
PM