Hellenico

Συζητήσεις για προετοιμασία για τον διαγωνισμό, online διαγωνισμούς, βιβλία προγραμματισμού και αλγορίθμων, και όλων των σχετικών.
Άβαταρ μέλους
switch
Δημοσιεύσεις: 57
Εγγραφή: Σάβ Δεκ 05, 2015 11:46 am
Τοποθεσία: 127.0.0.1

Re: Hellenico

Δημοσίευση από switch »

_Dimitris_ έγραψε:
Πέμ Ιούλ 23, 2020 7:05 pm
Καλησπέρα. Ο ΧΡΟΝΟΣ*ΤΑΧΥΤΗΤΑ είναι integer αλλά όταν διαιρεθεί με bandwidth γίνεται double.
Όπως βλέπω στο παράδειγμα, το 22 (ο ελάχιστος χρόνος) δεν παθαίνει κάποια αλλαγή. Ο άλλος παθαίνει με αυτήν την πράξη και από 57 γίνεται 21 (22+21=43). Με τον παραπάνω κώδικα, το output σε αυτό το testcase είναι όντως 43. Έχεις/Έχετε δίκιο με το time=X. Θα ήταν καλύτερο το time=files[0].second αφού γίνεται η ταξινόμηση με βάση τον χρόνο (τότε το time θα έχει τον ελάχιστο χρόνο, το 22 στο παράδειγμα). Όσο για την περιττή γραμμή κώδικα, ναι όντως είναι άκυρη. Αναφορά στο i γίνεται μετά από κάθε φορά που λέει files, μέσα σε αγκύλες (στη θέση i του vector). Απλά δεν μου το παίρνει το forum εξαιτίας των αγκυλών.
Στο ΧΡΟΝΟΣ*ΤΑΧΥΤΗΤΑ θέλω να μου πεις τι αναπαριστά, όχι τι τύπος είναι. π.χ. είναι βάρος, εμβαδό, επιτάχυνση κλπ;

Εφόσον θέλεις να κρατήσεις τον "πρώτο" χρόνο, θα πρέπει να υπολογίσεις πως θα αλλάξουν οι ταχύτητες των εναπομένοντων αρχείων ΜΕΤΑ την ολοκλήρωση του πρώτου αρχείου. Μπορείς να δεις την παρακάτω εικόνα σαν μια ιδέα. Στη θέση (0) ξεκινούν τα κατεβάσματα. Στη θέση (1) έχει τελειώσει το πρώτο αρχείο και γίνεται ανακατανομή του bandwidth με κάποιο τρόπο. Το παρακάτω σχήμα παρουσιάζει μια ιδέα για την ανακατανομή, όχι απαραίτητα σωστή.
band.png
band.png (10.09 KiB) Προβλήθηκε 717 φορές
Όταν θέλεις να βάλεις κώδικα να το βάζεις ανάμεσα σε [cοde] και [/cοde] ώστε να εμφανίζεται σωστά.
Φυσικά μπορείς να το ενθέσεις μέσα σε [spοiler][cοde]....[/cοde][/spοiler]

_Dimitris_
Δημοσιεύσεις: 32
Εγγραφή: Τετ Ιούλ 22, 2020 4:55 pm

Re: Hellenico

Δημοσίευση από _Dimitris_ »

switch έγραψε:
Παρ Ιούλ 24, 2020 12:04 pm
_Dimitris_ έγραψε:
Πέμ Ιούλ 23, 2020 7:05 pm
Καλησπέρα. Ο ΧΡΟΝΟΣ*ΤΑΧΥΤΗΤΑ είναι integer αλλά όταν διαιρεθεί με bandwidth γίνεται double.
Όπως βλέπω στο παράδειγμα, το 22 (ο ελάχιστος χρόνος) δεν παθαίνει κάποια αλλαγή. Ο άλλος παθαίνει με αυτήν την πράξη και από 57 γίνεται 21 (22+21=43). Με τον παραπάνω κώδικα, το output σε αυτό το testcase είναι όντως 43. Έχεις/Έχετε δίκιο με το time=X. Θα ήταν καλύτερο το time=files[0].second αφού γίνεται η ταξινόμηση με βάση τον χρόνο (τότε το time θα έχει τον ελάχιστο χρόνο, το 22 στο παράδειγμα). Όσο για την περιττή γραμμή κώδικα, ναι όντως είναι άκυρη. Αναφορά στο i γίνεται μετά από κάθε φορά που λέει files, μέσα σε αγκύλες (στη θέση i του vector). Απλά δεν μου το παίρνει το forum εξαιτίας των αγκυλών.
Στο ΧΡΟΝΟΣ*ΤΑΧΥΤΗΤΑ θέλω να μου πεις τι αναπαριστά, όχι τι τύπος είναι. π.χ. είναι βάρος, εμβαδό, επιτάχυνση κλπ;

Εφόσον θέλεις να κρατήσεις τον "πρώτο" χρόνο, θα πρέπει να υπολογίσεις πως θα αλλάξουν οι ταχύτητες των εναπομένοντων αρχείων ΜΕΤΑ την ολοκλήρωση του πρώτου αρχείου. Μπορείς να δεις την παρακάτω εικόνα σαν μια ιδέα. Στη θέση (0) ξεκινούν τα κατεβάσματα. Στη θέση (1) έχει τελειώσει το πρώτο αρχείο και γίνεται ανακατανομή του bandwidth με κάποιο τρόπο. Το παρακάτω σχήμα παρουσιάζει μια ιδέα για την ανακατανομή, όχι απαραίτητα σωστή.
band.png
Όταν θέλεις να βάλεις κώδικα να το βάζεις ανάμεσα σε [cοde] και [/cοde] ώστε να εμφανίζεται σωστά.
Φυσικά μπορείς να το ενθέσεις μέσα σε [spοiler][cοde]....[/cοde][/spοiler]
Δεν ξέρω το χρόνος*ταχύτητα τι μέγεθος είναι, είναι ο τύπος που δίνει η εκφώνηση, έτσι τον χρησιμοποίησα. Σε/Σας ευχαριστώ πολύ που αφιέρωσες/αφιερώσατε τόσο χρόνο για εμένα, όμως το σχήμα δεν με βοήθησε και πολύ. Μήπως θα μπορούσες/μπορούσατε να μου εξηγήσεις/εξηγήσετε γιατί ο κώδικας δεν λειτουργεί σωστά στα 9 testcases ή τι του λείπει; Πιστεύω ότι αν είχε άλλο ένα παράδειγμα με 3 αρχεία θα ήταν πιο εύκολο, δεν έχω κατανοήσει καλά ακόμα τι θέλει το πρόβλημα όταν έχω 3+ αρχεία. Ευχαριστώ πολύ...

Άβαταρ μέλους
switch
Δημοσιεύσεις: 57
Εγγραφή: Σάβ Δεκ 05, 2015 11:46 am
Τοποθεσία: 127.0.0.1

Re: Hellenico

Δημοσίευση από switch »

Να ένα test case δικο μου:
downloads.in

Κώδικας: Επιλογή όλων

4
10 10
20 20
30 30
40 40
downloads.out

Κώδικας: Επιλογή όλων

30

_Dimitris_
Δημοσιεύσεις: 32
Εγγραφή: Τετ Ιούλ 22, 2020 4:55 pm

Re: Hellenico

Δημοσίευση από _Dimitris_ »

switch έγραψε:
Παρ Ιούλ 24, 2020 12:47 pm
Να ένα test case δικο μου:
downloads.in

Κώδικας: Επιλογή όλων

4
10 10
20 20
30 30
40 40
downloads.out

Κώδικας: Επιλογή όλων

30
Ευχαριστώ πολύ. Άρα bandwidth=100(=10+20+30+40) (και δεν αλλάζει). Περνούν τα 10 πρώτα δευτερόλεπτα. Το δεύτερο αρχείο θα θέλει 10 δευτερόλεπτα αλλά σύμφωνα με το bandwidth θα θέλει 10*20/100=2 (time=10+2=12). Μετά για το τρίτο αρχείο (30-12)*30/100=5.4 (time=12+5.4=17.4). Τέταρτο και τελευταίο αρχείο: (40-17.4)*40/100=9.04. Time=17.4+9.04=26.44. Round(time)=26
Όμως 26!=30. Άρα πού είναι το λάθος στη σκέψη μου και το έβγαλα 26 αντί για 30;

Άβαταρ μέλους
switch
Δημοσιεύσεις: 57
Εγγραφή: Σάβ Δεκ 05, 2015 11:46 am
Τοποθεσία: 127.0.0.1

Re: Hellenico

Δημοσίευση από switch »

_Dimitris_ έγραψε:
Παρ Ιούλ 24, 2020 1:00 pm
Περνούν τα 10 πρώτα δευτερόλεπτα. Το δεύτερο αρχείο θα θέλει 10 δευτερόλεπτα
Όχι, θα θέλει λιγότερο, εφόσον ελευθερώθηκε το τμήμα του bandwidth που δέσμευε το πρώτο αρχείο οπότε θα κατεβαίνει πιο γρήγορα.

_Dimitris_
Δημοσιεύσεις: 32
Εγγραφή: Τετ Ιούλ 22, 2020 4:55 pm

Re: Hellenico

Δημοσίευση από _Dimitris_ »

switch έγραψε:
Παρ Ιούλ 24, 2020 1:49 pm
_Dimitris_ έγραψε:
Παρ Ιούλ 24, 2020 1:00 pm
Περνούν τα 10 πρώτα δευτερόλεπτα. Το δεύτερο αρχείο θα θέλει 10 δευτερόλεπτα
Όχι, θα θέλει λιγότερο, εφόσον ελευθερώθηκε το τμήμα του bandwidth που δέσμευε το πρώτο αρχείο οπότε θα κατεβαίνει πιο γρήγορα.
Ναι όπως είπα θα θέλει (20-10)*20/100=2 δευτερόλεπτα, σωστα;

Άβαταρ μέλους
switch
Δημοσιεύσεις: 57
Εγγραφή: Σάβ Δεκ 05, 2015 11:46 am
Τοποθεσία: 127.0.0.1

Re: Hellenico

Δημοσίευση από switch »

_Dimitris_ έγραψε:
Παρ Ιούλ 24, 2020 1:52 pm
Ναι όπως είπα θα θέλει (20-10)*20/100=2 δευτερόλεπτα, σωστα;
Πως κατανέμεις το ελευθερωμένο bandwidth του ολοκληρωμένου 1ου αρχείου στο 2ο και στα μετέπειτα αρχεία?

_Dimitris_
Δημοσιεύσεις: 32
Εγγραφή: Τετ Ιούλ 22, 2020 4:55 pm

Re: Hellenico

Δημοσίευση από _Dimitris_ »

switch έγραψε:
Παρ Ιούλ 24, 2020 2:21 pm
_Dimitris_ έγραψε:
Παρ Ιούλ 24, 2020 1:52 pm
Ναι όπως είπα θα θέλει (20-10)*20/100=2 δευτερόλεπτα, σωστα;
Πως κατανέμεις το ελευθερωμένο bandwidth του ολοκληρωμένου 1ου αρχείου στο 2ο και στα μετέπειτα αρχεία?
Θα ήθελα να μου εξηγήσεις/εξηγήσετε αναλυτικά τις πράξεις που πρέπει να γίνουν ώστε το time να βγει 30 με τον τρόπο που έβγαλα εγω το 26. Αν κατανοήσω το τι πρέπει να κάνω, θα το βρω πώς να το μεταφράσω σε c++. Απλώς αν σου/σας είναι εύκολο, θα με βοηθούσε πολύ. Σε/Σας ευχαριστώ.

Άβαταρ μέλους
switch
Δημοσιεύσεις: 57
Εγγραφή: Σάβ Δεκ 05, 2015 11:46 am
Τοποθεσία: 127.0.0.1

Re: Hellenico

Δημοσίευση από switch »

Υπάρχουν περισσότερες από μια λύσεις για το πρόβλημα αυτό. Ίσως υπάρχει λύση πιο απλή από αυτή που περιγράφω παρακάτω, όμως θα πρέπει να κατανοήσεις το πρόβλημα στο μυαλό σου ώστε να το μετασχηματίσεις όπως σε βολεύει. Οπότε αυτή τη λύση άφησε τη για μετά.

-------

Ο τρόπος που θα κατανεμηθεί το bandwidth είναι κλειδί για τη λύση και τα ενδιάμεσα αποτελέσματα που θα βγούν καθώς και για το αν θα γινόταν accept ο κώδικας απο όρια χρόνου ή όχι (αν και το hellenico είναι πολύ χαλαρό με τα time limits).

Ο σκοπός των προβλημάτων του hellenico δεν είναι να έχεις έτοιμη τη λύση σε ψευδοκώδικα και να το μετατρέψεις σε γλώσσα προγραμματισμού, αλλά να βρεις τρόπο να το λύσεις (και μετά να το γράψεις σε γλώσσα προγραμματισμού). Η άποψη μου είναι ότι δεν πρέπει να σου δώσω λύση αλλά να σε βοηθήσω να φτάσεις σε αυτή.

Θα ονομάσω τα members first και second του pair ως speed και duration αντίστοιχα για ευκολία στην περιγραφή μου. Στον κώδικα θα μπορούσε να γίνει το ίδιο (χωρίς όμως να είναι απαραίτητο) με τις εντολές του preprocessor:

Κώδικας: Επιλογή όλων

#define first speed
#define second duration
Όλα τα αρχεία θα κατεβάσουν για χρόνο files[0].duration με την αρχική τους ταχύτητα.
Απο εκεί και πέρα, έχει περισσέψει ένα files[0].speed που πρέπει να κατανεμηθεί στα υπόλοιπα αρχεία με τον τρόπο που θα διαλέξεις εσύ. Θα κατανεμηθεί ισομερώς; θα κατανεμηθεί σε ένα; κλπ Έχει σημασία πως θα κατανεμηθεί για το αποτέλεσμα; Είναι απαντήσεις που πρέπει να βρεις.

Όταν φτάσεις στο δεύτερο αρχείο, έχει κατέβει με ταχύτητα files[1].speed για χρόνο files[0].duration. Πόσο χρόνο θέλει για να τελειώσει; Να θυμάσαι ότι δεν έχει όλο το bandwidth δικό του. Έχει όμως ταχύτητα files[1].speed επαυξημένη όσο του μοιράσεις από το files[0].speed ελευθερώθηκε πριν.

_Dimitris_
Δημοσιεύσεις: 32
Εγγραφή: Τετ Ιούλ 22, 2020 4:55 pm

Re: Hellenico

Δημοσίευση από _Dimitris_ »

switch έγραψε:
Παρ Ιούλ 24, 2020 4:03 pm
Υπάρχουν περισσότερες από μια λύσεις για το πρόβλημα αυτό. Ίσως υπάρχει λύση πιο απλή από αυτή που περιγράφω παρακάτω, όμως θα πρέπει να κατανοήσεις το πρόβλημα στο μυαλό σου ώστε να το μετασχηματίσεις όπως σε βολεύει. Οπότε αυτή τη λύση άφησε τη για μετά.

-------

Ο τρόπος που θα κατανεμηθεί το bandwidth είναι κλειδί για τη λύση και τα ενδιάμεσα αποτελέσματα που θα βγούν καθώς και για το αν θα γινόταν accept ο κώδικας απο όρια χρόνου ή όχι (αν και το hellenico είναι πολύ χαλαρό με τα time limits).

Ο σκοπός των προβλημάτων του hellenico δεν είναι να έχεις έτοιμη τη λύση σε ψευδοκώδικα και να το μετατρέψεις σε γλώσσα προγραμματισμού, αλλά να βρεις τρόπο να το λύσεις (και μετά να το γράψεις σε γλώσσα προγραμματισμού). Η άποψη μου είναι ότι δεν πρέπει να σου δώσω λύση αλλά να σε βοηθήσω να φτάσεις σε αυτή.

Θα ονομάσω τα members first και second του pair ως speed και duration αντίστοιχα για ευκολία στην περιγραφή μου. Στον κώδικα θα μπορούσε να γίνει το ίδιο (χωρίς όμως να είναι απαραίτητο) με τις εντολές του preprocessor:

Κώδικας: Επιλογή όλων

#define first speed
#define second duration
Όλα τα αρχεία θα κατεβάσουν για χρόνο files[0].duration με την αρχική τους ταχύτητα.
Απο εκεί και πέρα, έχει περισσέψει ένα files[0].speed που πρέπει να κατανεμηθεί στα υπόλοιπα αρχεία με τον τρόπο που θα διαλέξεις εσύ. Θα κατανεμηθεί ισομερώς; θα κατανεμηθεί σε ένα; κλπ Έχει σημασία πως θα κατανεμηθεί για το αποτέλεσμα; Είναι απαντήσεις που πρέπει να βρεις.

Όταν φτάσεις στο δεύτερο αρχείο, έχει κατέβει με ταχύτητα files[1].speed για χρόνο files[0].duration. Πόσο χρόνο θέλει για να τελειώσει; Να θυμάσαι ότι δεν έχει όλο το bandwidth δικό του. Έχει όμως ταχύτητα files[1].speed επαυξημένη όσο του μοιράσεις από το files[0].speed ελευθερώθηκε πριν.
Ευχαριστώ για τη βοήθεια, το καταλαβαίνω αυτό όμως δεν με βοηθάει ιδιαίτερα καθώς δεν μπορώ να καταλάβω πώς βγαίνει το 30 στο testcase που μου έδωσες/δώσατε. Δηλαδή γιατί να μην είναι 26 και να είναι 30; Πιστεύεις/Πιστεύετε ότι θα μου αποκαλυφθεί η λύση του προβλήματος αν μου εξηγήσετε τις πράξεις που πρέπει να γίνουν;

Άβαταρ μέλους
Κηπουρίδης
Δημοσιεύσεις: 360
Εγγραφή: Παρ Φεβ 05, 2010 5:05 pm

Re: Hellenico

Δημοσίευση από Κηπουρίδης »

_Dimitris_ έγραψε:
Παρ Ιούλ 24, 2020 4:11 pm
...
Ευχαριστώ για τη βοήθεια, το καταλαβαίνω αυτό όμως δεν με βοηθάει ιδιαίτερα καθώς δεν μπορώ να καταλάβω πώς βγαίνει το 30 στο testcase που μου έδωσες/δώσατε. Δηλαδή γιατί να μην είναι 26 και να είναι 30; Πιστεύεις/Πιστεύετε ότι θα μου αποκαλυφθεί η λύση του προβλήματος αν μου εξηγήσετε τις πράξεις που πρέπει να γίνουν;
Καλησπέρα Δημήτρη παλικάρι, χαιρόμαστε όλοι πολύ την επιμονή σου, συνέχισε έτσι και θα πας μπροστά.

Στο πρόβλημα τώρα: Καταλαβαίνω γιατί δυσκολεύεσαι. Όντως η εκφώνηση δεν είναι ξεκάθαρη για το πώς θα γίνει η ανακατανομή του bandwidth... όμως υπάρχει λόγος για αυτό. Και κρύβεται στην ερώτηση που σου έκανε ο switch, αν παίζει ρόλο το πώς θα ανακατανείμουμε το bandwidth. Όπως καταλαβαίνεις, η απάντηση είναι όχι, δεν παίζει ρόλο, και για αυτό η εκφώνηση δεν ξεκαθαρίζει το πώς θα γίνει η ανακατανομή. Διότι τότε απλά θα ακολουθούσατε οδηγίες, ενώ τώρα υπάρχει δημιουργικότητα. Το ΓΙΑΤΙ δεν παίζει ρόλο όμως το πώς θα ανακατανείμουμε είναι κάτι που θα πρέπει να αποδείξεις εσύ! Είναι ωραία άσκηση, προσπάθησέ την.

Γυρνάω λοιπόν στο ζουμί της υπόθεσης. Δε θα σου πω κάποια λύση (υπάρχουν πολλές και θα το αφήσω πάνω σου). Θα σου πω όμως που έχει λάθος η δική σου λογική, κι ελπίζω ότι αυτό θα σε βοηθήσει να ξεκολλήσεις, και να αλλάξεις ελάχιστα τη λογική σου ώστε να γίνει σωστή.
Λες ότι αρχικά περνάνε τα πρώτα 10 δευτερόλεπτα, και τελειώνει η πρώτη εργασία. Συμφωνώ ως εδώ.
Μετά λες ότι απομένουν (20-10) δευτερόλεπτα για το δεύτερο τασκ. Το πολλαπλασιάζεις με 20, που είναι η αρχική του ταχύτητα. Είναι σημαντικό να καταλάβεις τι είναι το αποτέλεσμα 10*20=200 που παίρνεις. Δεν είναι χρόνος (χρόνος είναι το 10). Δεν είναι ταχύτητα (ταχύτητα είναι το 20). Είναι κάτι άλλο...
Anyway, μετά λες ότι διαιρείς με το 100 (το συνολικό bandwidth), οπότε σε 2 ακόμα δευτερόλεπτα τελειώνει και η δεύτερη εργασία. Συμφωνώ ακόμη μαζί σου, καμμία ασυνέπεια στη λογική σου. Αλλιώς θα το έκανα εγώ βέβαια, αλλά αυτό είναι το όμορφο του προγραμματισμού, μπορείς να κάνεις διάφορα πράγματα και να είναι εξίσου σωστά.

Και τώρα έρχεται το λάθος σου. Μετά λες ότι για το τρίτο τασκ έχουν περάσει ήδη 12 δευτερόλεπτα, άρα του μένουν 18. Εδώ διαφωνούμε. Συμφωνώ ότι πέρασαν 10 δευτερόλεπτα, άρα το 30 έχει πέσει στο 20. Και συμφωνώ ότι πέρασαν άλλα 2 δευτερόλεπτα... αλλά το 20 γιατί πέφτει σε 18; Αφού σε εκείνα τα δύο δευτερόλεπτα έδωσες ΟΛΟ το bandwidth στη δεύτερη εργασία. Άρα εκείνα τα 2 δευτερόλεπτα, η τρίτη εργασία δεν κατέβηκε καθόλου.

Ελπίζω να βοήθησα στον εντοπισμό του σφάλματός σου. Κάνε μια χάρη στον εαυτό σου, κι ακόμα κι αν αλλάξεις τον κώδικα και περάσει τα testcases, μην προχωρήσεις άλλο. Πρώτα να απαντήσεις (στον εαυτό σου) τις δύο ερωτήσεις. Γιατί δεν παίζει ρόλο πώς θα ανακατανείμουμε το bandwidth; Και τι μέγεθος δηλώνει ο πολλαπλασιασμός σου, που δεν είναι ούτε χρόνος ούτε ταχύτητα.

Κάτι ακόμα (άσχετο με το πρόβλημα). Μ' άρεσε πολύ η προσπάθεια που έκανες να μας εξηγήσεις τον κώδικά σου σε φυσική γλώσσα. Αλλά μάλλον δεν κατάφερα εγώ να σου κάνω ξεκάθαρο το τι ζητούσα, κι έτσι θα προσπαθήσω να το πω άλλη μια φορά για να σε βοηθήσω για το μέλλον. Όταν ρωτούσα ΤΙ κάνεις, δεν εννοούσα να περιγράψουμε με φυσική γλώσσα τον ίδιο τον κώδικα, αλλά τη λογική του κώδικα. Για παράδειγμα:
Πρόβλημα: Θέλω να πάω από την Αθήνα στη Θεσσαλονίκη αλλά δε βρίσκω φθηνό αεροπλάνο.
Λύση (το ΤΙ θα κάνω): Θα πάω με αμάξι.
Αυτό είναι που ήθελα να μου γράψεις. Μετά ακολουθεί το ΠΩΣ θα το κάνω (που είναι σαν τον κώδικα) και έχει πολλά βήματα: Θα πάρω τα κλειδιά απ' τη ζακέτα μου, θα πάρω το πορτοφόλι μου, θα κατέβω απ' το σπίτι μου, θα μπω στο αμάξι μου, θα ξεκινήσω να οδηγάω, θα πληρώσω λεφτά στα διόδια, κλπ κλπ κλπ.
Όπως καταλαβαίνεις, αν σαν λύση για το τι θα κάνω για να πάω χωρίς αεροπλάνο, άρχιζα να σου αραδιάζω αυτές τις λεπτομέρειες (το ΠΩΣ) τότε θα μπερδευόσουν. Δε θα ήταν ξεκάθαρη η κεντρική ιδέα, που είναι ότι θα πάρω αμάξι.
Βεβαίως αυτά τα ΤΙ και ΠΩΣ που λέω μπλέκονται πάντα μεταξύ τους σε κάποιο βαθμό. Δεν υπάρχει ένας τρόπος να απαντήσεις ξεκάθαρα τι είναι ΤΙ και τι είναι ΠΩΣ. Αλλά σε γενικές γραμμές, προσπαθούμε να δώσουμε την κεντρική ιδέα χωρίς λεπτομέρειες, γιατί αυτές τείνουν να κρύβουν την κεντρική ιδέα.

Με θαυμασμό για την επιμονή σου!
Βαγγέλης
Λύσεις θεμάτων ΠΔΠ: https://pdp-archive.github.io/
Μπούσουλας διαβάσματος ΠΔΠ: http://snf-800715.vm.okeanos.grnet.gr/PDP/
Tutorials: https://kallinikos.github.io/
Επίσημο forum ΠΔΠ: https://www.pdpforum.eu.org/forum/

_Dimitris_
Δημοσιεύσεις: 32
Εγγραφή: Τετ Ιούλ 22, 2020 4:55 pm

Re: Hellenico

Δημοσίευση από _Dimitris_ »

Κηπουρίδης έγραψε:
Παρ Ιούλ 24, 2020 5:22 pm
_Dimitris_ έγραψε:
Παρ Ιούλ 24, 2020 4:11 pm
...
Ευχαριστώ για τη βοήθεια, το καταλαβαίνω αυτό όμως δεν με βοηθάει ιδιαίτερα καθώς δεν μπορώ να καταλάβω πώς βγαίνει το 30 στο testcase που μου έδωσες/δώσατε. Δηλαδή γιατί να μην είναι 26 και να είναι 30; Πιστεύεις/Πιστεύετε ότι θα μου αποκαλυφθεί η λύση του προβλήματος αν μου εξηγήσετε τις πράξεις που πρέπει να γίνουν;
Καλησπέρα Δημήτρη παλικάρι, χαιρόμαστε όλοι πολύ την επιμονή σου, συνέχισε έτσι και θα πας μπροστά.

Στο πρόβλημα τώρα: Καταλαβαίνω γιατί δυσκολεύεσαι. Όντως η εκφώνηση δεν είναι ξεκάθαρη για το πώς θα γίνει η ανακατανομή του bandwidth... όμως υπάρχει λόγος για αυτό. Και κρύβεται στην ερώτηση που σου έκανε ο switch, αν παίζει ρόλο το πώς θα ανακατανείμουμε το bandwidth. Όπως καταλαβαίνεις, η απάντηση είναι όχι, δεν παίζει ρόλο, και για αυτό η εκφώνηση δεν ξεκαθαρίζει το πώς θα γίνει η ανακατανομή. Διότι τότε απλά θα ακολουθούσατε οδηγίες, ενώ τώρα υπάρχει δημιουργικότητα. Το ΓΙΑΤΙ δεν παίζει ρόλο όμως το πώς θα ανακατανείμουμε είναι κάτι που θα πρέπει να αποδείξεις εσύ! Είναι ωραία άσκηση, προσπάθησέ την.

Γυρνάω λοιπόν στο ζουμί της υπόθεσης. Δε θα σου πω κάποια λύση (υπάρχουν πολλές και θα το αφήσω πάνω σου). Θα σου πω όμως που έχει λάθος η δική σου λογική, κι ελπίζω ότι αυτό θα σε βοηθήσει να ξεκολλήσεις, και να αλλάξεις ελάχιστα τη λογική σου ώστε να γίνει σωστή.
Λες ότι αρχικά περνάνε τα πρώτα 10 δευτερόλεπτα, και τελειώνει η πρώτη εργασία. Συμφωνώ ως εδώ.
Μετά λες ότι απομένουν (20-10) δευτερόλεπτα για το δεύτερο τασκ. Το πολλαπλασιάζεις με 20, που είναι η αρχική του ταχύτητα. Είναι σημαντικό να καταλάβεις τι είναι το αποτέλεσμα 10*20=200 που παίρνεις. Δεν είναι χρόνος (χρόνος είναι το 10). Δεν είναι ταχύτητα (ταχύτητα είναι το 20). Είναι κάτι άλλο...
Anyway, μετά λες ότι διαιρείς με το 100 (το συνολικό bandwidth), οπότε σε 2 ακόμα δευτερόλεπτα τελειώνει και η δεύτερη εργασία. Συμφωνώ ακόμη μαζί σου, καμμία ασυνέπεια στη λογική σου. Αλλιώς θα το έκανα εγώ βέβαια, αλλά αυτό είναι το όμορφο του προγραμματισμού, μπορείς να κάνεις διάφορα πράγματα και να είναι εξίσου σωστά.

Και τώρα έρχεται το λάθος σου. Μετά λες ότι για το τρίτο τασκ έχουν περάσει ήδη 12 δευτερόλεπτα, άρα του μένουν 18. Εδώ διαφωνούμε. Συμφωνώ ότι πέρασαν 10 δευτερόλεπτα, άρα το 30 έχει πέσει στο 20. Και συμφωνώ ότι πέρασαν άλλα 2 δευτερόλεπτα... αλλά το 20 γιατί πέφτει σε 18; Αφού σε εκείνα τα δύο δευτερόλεπτα έδωσες ΟΛΟ το bandwidth στη δεύτερη εργασία. Άρα εκείνα τα 2 δευτερόλεπτα, η τρίτη εργασία δεν κατέβηκε καθόλου.

Ελπίζω να βοήθησα στον εντοπισμό του σφάλματός σου. Κάνε μια χάρη στον εαυτό σου, κι ακόμα κι αν αλλάξεις τον κώδικα και περάσει τα testcases, μην προχωρήσεις άλλο. Πρώτα να απαντήσεις (στον εαυτό σου) τις δύο ερωτήσεις. Γιατί δεν παίζει ρόλο πώς θα ανακατανείμουμε το bandwidth; Και τι μέγεθος δηλώνει ο πολλαπλασιασμός σου, που δεν είναι ούτε χρόνος ούτε ταχύτητα.

Κάτι ακόμα (άσχετο με το πρόβλημα). Μ' άρεσε πολύ η προσπάθεια που έκανες να μας εξηγήσεις τον κώδικά σου σε φυσική γλώσσα. Αλλά μάλλον δεν κατάφερα εγώ να σου κάνω ξεκάθαρο το τι ζητούσα, κι έτσι θα προσπαθήσω να το πω άλλη μια φορά για να σε βοηθήσω για το μέλλον. Όταν ρωτούσα ΤΙ κάνεις, δεν εννοούσα να περιγράψουμε με φυσική γλώσσα τον ίδιο τον κώδικα, αλλά τη λογική του κώδικα. Για παράδειγμα:
Πρόβλημα: Θέλω να πάω από την Αθήνα στη Θεσσαλονίκη αλλά δε βρίσκω φθηνό αεροπλάνο.
Λύση (το ΤΙ θα κάνω): Θα πάω με αμάξι.
Αυτό είναι που ήθελα να μου γράψεις. Μετά ακολουθεί το ΠΩΣ θα το κάνω (που είναι σαν τον κώδικα) και έχει πολλά βήματα: Θα πάρω τα κλειδιά απ' τη ζακέτα μου, θα πάρω το πορτοφόλι μου, θα κατέβω απ' το σπίτι μου, θα μπω στο αμάξι μου, θα ξεκινήσω να οδηγάω, θα πληρώσω λεφτά στα διόδια, κλπ κλπ κλπ.
Όπως καταλαβαίνεις, αν σαν λύση για το τι θα κάνω για να πάω χωρίς αεροπλάνο, άρχιζα να σου αραδιάζω αυτές τις λεπτομέρειες (το ΠΩΣ) τότε θα μπερδευόσουν. Δε θα ήταν ξεκάθαρη η κεντρική ιδέα, που είναι ότι θα πάρω αμάξι.
Βεβαίως αυτά τα ΤΙ και ΠΩΣ που λέω μπλέκονται πάντα μεταξύ τους σε κάποιο βαθμό. Δεν υπάρχει ένας τρόπος να απαντήσεις ξεκάθαρα τι είναι ΤΙ και τι είναι ΠΩΣ. Αλλά σε γενικές γραμμές, προσπαθούμε να δώσουμε την κεντρική ιδέα χωρίς λεπτομέρειες, γιατί αυτές τείνουν να κρύβουν την κεντρική ιδέα.

Με θαυμασμό για την επιμονή σου!
Βαγγέλης
(Ξεκινώντας, θα ήθελα να ζητήσω συγγνώμη αν είστε κάποιος συνομήλικός μου, αλλά θα απευθυνθώ στον πληθυντικό αριθμό)

Κ. Βαγγέλη, εκτιμώ ιδιαίτερα το χρόνο που καταβάλατε για εμένα. Δεν ξέρω γιατί με δυσκολεύει τόσο αυτό το πρόβλημα και κυρίως να απαντήσω στα 2 ερωτήματα, έχω εμπειρία στον προγραμματισμό και έχω λύσει πιο δύσκολα προβλήματα και δεν καταλαβαίνω τι με εμποδίζει τόσο πολύ σε αυτό. Όπως θα τα σκεφτώ καλά και θα προσπαθήσω να τα απαντήσω 😊. Με βοηθήσατε πράγματι στον εντοπισμό του σφάλματος απλώς αν κατάλαβα καλά (σύμφωνα με το testcase του switch) περνούν τα 10 πρώτα. Στο δεύτερο έχουμε (20-10)*20/100=2 (time=10+2=12). Στο τρίτο τώρα δηλαδή γίνεται (30-10-12)*30/100=2.4; (time=10+2+2.4=14.4). Τέταρτο: (40-10-12-14.4)*40/100=1.44 (time=10+2+2.4+1.44=15.84) round time=16!=30. Άρα πάλι μάλλον κάτι κατάλαβα λάθος. Συγγνώμη αν σας γίνομαι βάρος ή αν δεν καταλαβαίνω κάτι προφανές, άθελά μου το κάνω. Απλώς δεν μπορώ να βρω πώς βγαίνει αυτό το 30. Επίσης θα κάνω μια προσπάθεια να βρω τι μέγεθος είναι το (20-10)*20. Θα πω μία σκέψη. Αφού το 10 που θα μείνει θα είναι χρόνος (seconds) και το πολλαπλασιάζουμε με ταχύτητα (Kilobytes/second) τότε seconds*(kilobytes/seconds) μας δίνει Kilobytes. Άρα το μέγεθος είναι kilobytes?

Άβαταρ μέλους
switch
Δημοσιεύσεις: 57
Εγγραφή: Σάβ Δεκ 05, 2015 11:46 am
Τοποθεσία: 127.0.0.1

Re: Hellenico

Δημοσίευση από switch »

Δεν μας κουράζεις. Και εμείς χαιρόμαστε όταν βοηθάμε, όπως μας βοήθησαν και εμάς.

Το πρώτο ερώτημα το βρήκες. Είναι το ΜΕΓΕΘΟΣ. Δεν έχει σημασία αν είναι σε Kb ή άλλες μονάδες.
ΤΑΧΥΤΗΤΑ = ΜΕΓΕΘΟΣ / ΧΡΟΝΟ -> ΜΕΓΕΘΟΣ = ΧΡΟΝΟΣ * ΤΑΧΥΤΗΤΑ. Πάρα πολύ ωραία.
Στο τρίτο τώρα δηλαδή γίνεται (30-10-12)*30/100=2.4;
Τα πρώτα 10 δευτερόλεπτα κατέβαζες με files[2].speed το αρχείο αυτό. Τα 12 επόμενα δεν κατέβασες καθόλου (έτρωγε το bandwidth το file[1]). Αρα πόσα δευτερόλεπτα θέλεις ακόμα για να ολοκληρωθεί το files[2]; Το αρχείο δεν είναι ολόκληρο για κατέβασμα τώρα. Κάποιο τμήμα του έχει ήδη κατέβει μέχρι τώρα.

_Dimitris_
Δημοσιεύσεις: 32
Εγγραφή: Τετ Ιούλ 22, 2020 4:55 pm

Re: Hellenico

Δημοσίευση από _Dimitris_ »

switch έγραψε:
Παρ Ιούλ 24, 2020 6:45 pm
Δεν μας κουράζεις. Και εμείς χαιρόμαστε όταν βοηθάμε, όπως μας βοήθησαν και εμάς.

Το πρώτο ερώτημα το βρήκες. Είναι το ΜΕΓΕΘΟΣ. Δεν έχει σημασία αν είναι σε Kb ή άλλες μονάδες.
ΤΑΧΥΤΗΤΑ = ΜΕΓΕΘΟΣ / ΧΡΟΝΟ -> ΜΕΓΕΘΟΣ = ΧΡΟΝΟΣ * ΤΑΧΥΤΗΤΑ. Πάρα πολύ ωραία.
Στο τρίτο τώρα δηλαδή γίνεται (30-10-12)*30/100=2.4;
Τα πρώτα 10 δευτερόλεπτα κατέβαζες με files[2].speed το αρχείο αυτό. Τα 12 επόμενα δεν κατέβασες καθόλου (έτρωγε το bandwidth το file[1]). Αρα πόσα δευτερόλεπτα θέλεις ακόμα για να ολοκληρωθεί το files[2]; Το αρχείο δεν είναι ολόκληρο για κατέβασμα τώρα. Κάποιο τμήμα του έχει ήδη κατέβει μέχρι τώρα.
Βρε συνάδελφοι προγραμματιστές, απλώς ποιο είναι το λάθος στην πράξη; Απ' ό,τι κατάλαβα switch είναι η ταχύτητα ή ο χρόνος; Σίγουρα θα διαιρεθεί με 100, το bandwidth είναι σταθερό. Άρα το λάθος είναι στην αφαίρεση (χρόνος) ή στην ταχύτητα, που παίρνω την ταχύτητα την αρχική δίπλα από το κάθε αρχείο; Λίγο αυτήν την πράξη δεν μπορώ να καταλάβω ώστε στο τέλος να βγάλω το 30. Δεν έχει να κάνει με προγραμματισμό το μπέρδεμά μου αλλά με τη λογική, το τι πρέπει να κάνω. Δεν το κατάλαβα και πολύ switch αυτό που έστειλες. Επίσης, χαίρομαι που δεν σας αποτελώ βάρος στην καθημερινότητά σας. Αναμένω την βοήθειά σας... Ευχαριστώ!

_Dimitris_
Δημοσιεύσεις: 32
Εγγραφή: Τετ Ιούλ 22, 2020 4:55 pm

Re: Hellenico

Δημοσίευση από _Dimitris_ »

_Dimitris_ έγραψε:
Παρ Ιούλ 24, 2020 6:59 pm
switch έγραψε:
Παρ Ιούλ 24, 2020 6:45 pm
Δεν μας κουράζεις. Και εμείς χαιρόμαστε όταν βοηθάμε, όπως μας βοήθησαν και εμάς.

Το πρώτο ερώτημα το βρήκες. Είναι το ΜΕΓΕΘΟΣ. Δεν έχει σημασία αν είναι σε Kb ή άλλες μονάδες.
ΤΑΧΥΤΗΤΑ = ΜΕΓΕΘΟΣ / ΧΡΟΝΟ -> ΜΕΓΕΘΟΣ = ΧΡΟΝΟΣ * ΤΑΧΥΤΗΤΑ. Πάρα πολύ ωραία.
Στο τρίτο τώρα δηλαδή γίνεται (30-10-12)*30/100=2.4;
Τα πρώτα 10 δευτερόλεπτα κατέβαζες με files[2].speed το αρχείο αυτό. Τα 12 επόμενα δεν κατέβασες καθόλου (έτρωγε το bandwidth το file[1]). Αρα πόσα δευτερόλεπτα θέλεις ακόμα για να ολοκληρωθεί το files[2]; Το αρχείο δεν είναι ολόκληρο για κατέβασμα τώρα. Κάποιο τμήμα του έχει ήδη κατέβει μέχρι τώρα.
Βρε συνάδελφοι προγραμματιστές, απλώς ποιο είναι το λάθος στην πράξη; Απ' ό,τι κατάλαβα switch είναι η ταχύτητα ή ο χρόνος; Σίγουρα θα διαιρεθεί με 100, το bandwidth είναι σταθερό. Άρα το λάθος είναι στην αφαίρεση (χρόνος) ή στην ταχύτητα, που παίρνω την ταχύτητα την αρχική δίπλα από το κάθε αρχείο; Λίγο αυτήν την πράξη δεν μπορώ να καταλάβω ώστε στο τέλος να βγάλω το 30. Δεν έχει να κάνει με προγραμματισμό το μπέρδεμά μου αλλά με τη λογική, το τι πρέπει να κάνω. Δεν το κατάλαβα και πολύ switch αυτό που έστειλες. Επίσης, χαίρομαι που δεν σας αποτελώ βάρος στην καθημερινότητά σας. Αναμένω την βοήθειά σας... Ευχαριστώ!
Μισό τώρα που ξαναβλέπω την απάντησή σου switch. Μήπως ο χρόνος είναι το 12; Δηλαδή 12*30/100=3.6 και τα πρώτα δευτερόλεπτα τα 10 σύνολο 13.6 για αυτό το αρχείο (το τρίτο);

Άβαταρ μέλους
switch
Δημοσιεύσεις: 57
Εγγραφή: Σάβ Δεκ 05, 2015 11:46 am
Τοποθεσία: 127.0.0.1

Re: Hellenico

Δημοσίευση από switch »

Sorry σε μπέρδεψα με το 12 (έγραφα βιαστικά). Θα δεις τι είναι το 12 παρακάτω.

Συνεχίζοντας από εκεί που έμεινε ο Βαγγέλης:
Κηπουρίδης έγραψε:
Παρ Ιούλ 24, 2020 5:22 pm

Λες ότι αρχικά περνάνε τα πρώτα 10 δευτερόλεπτα, και τελειώνει η πρώτη εργασία. Συμφωνώ ως εδώ.
...
Anyway, μετά λες ότι διαιρείς με το 100 (το συνολικό bandwidth), οπότε σε 2 ακόμα δευτερόλεπτα τελειώνει και η δεύτερη εργασία. Συμφωνώ ακόμη μαζί σου, καμία ασυνέπεια στη λογική σου. Αλλιώς θα το έκανα εγώ βέβαια, αλλά αυτό είναι το όμορφο του προγραμματισμού, μπορείς να κάνεις διάφορα πράγματα και να είναι εξίσου σωστά.
Χρονική στιγμή 0: ξεκινούν όλα τα κατεβάσματα
Χρονική στιγμή 10:τελειώνει το πρώτο task
Χρονική στιγμή 12:τελειώνει το δεύτερο task (γιατί;)
(Πόσο από το 3ο task έχει απομείνει;)
(Πότε θα τελειώσει το τρίτο task;)
...

_Dimitris_
Δημοσιεύσεις: 32
Εγγραφή: Τετ Ιούλ 22, 2020 4:55 pm

Re: Hellenico

Δημοσίευση από _Dimitris_ »

switch έγραψε:
Παρ Ιούλ 24, 2020 11:16 pm
Sorry σε μπέρδεψα με το 12 (έγραφα βιαστικά). Θα δεις τι είναι το 12 παρακάτω.

Συνεχίζοντας από εκεί που έμεινε ο Βαγγέλης:
Κηπουρίδης έγραψε:
Παρ Ιούλ 24, 2020 5:22 pm

Λες ότι αρχικά περνάνε τα πρώτα 10 δευτερόλεπτα, και τελειώνει η πρώτη εργασία. Συμφωνώ ως εδώ.
...
Anyway, μετά λες ότι διαιρείς με το 100 (το συνολικό bandwidth), οπότε σε 2 ακόμα δευτερόλεπτα τελειώνει και η δεύτερη εργασία. Συμφωνώ ακόμη μαζί σου, καμία ασυνέπεια στη λογική σου. Αλλιώς θα το έκανα εγώ βέβαια, αλλά αυτό είναι το όμορφο του προγραμματισμού, μπορείς να κάνεις διάφορα πράγματα και να είναι εξίσου σωστά.
Χρονική στιγμή 0: ξεκινούν όλα τα κατεβάσματα
Χρονική στιγμή 10:τελειώνει το πρώτο task
Χρονική στιγμή 12:τελειώνει το δεύτερο task (γιατί;)
(Πόσο από το 3ο task έχει απομείνει;)
(Πότε θα τελειώσει το τρίτο task;)
...
Αυτά τα ερωτήματα ψάχνω 😂. Πάντως ευχαριστώ που καλοκαιριατικα και τέτοια ώρα ασχολείστε κι εσείς με τον προγραμματισμό. Λοιπόν, το δεύτερο τελειώνει στη χρονική στιγμή 12, διότι (20-10)*20/100=2 δευτερόλεπτα θα το πάρει, αφού τελειώσει το 1 και έχουμε 10+2=12. Για το τρίτο έχουμε (30-12)*30/100=5.4 τη χρονική στιγμή 17.4. Άρα το συνολικό time τώρα θα έχει γίνει 17.4 και απαντώντας στο πρώτο ερώτημα (Πόσο από το 3ο task έχει απομείνει) απομένουν 18 δευτερόλεπτα. Ανακεφαλαίωση: Χρονική στιγμή 10: τελειώνει το πρώτο
(10 δευτερόλεπτα έχουν απομείνει στο 2ο)
Χρονική στιγμή 12: τελειώνει το δεύτερο
(18 δευτερόλεπτα έχουν απομείνει στο 3ο)
Χρονική στιγμή 17.4: τελειώνει και το 3ο

Σωστά τα ειπα; 🙂

Άβαταρ μέλους
switch
Δημοσιεύσεις: 57
Εγγραφή: Σάβ Δεκ 05, 2015 11:46 am
Τοποθεσία: 127.0.0.1

Re: Hellenico

Δημοσίευση από switch »

Όχι. Ο μαθηματικός σου συλλογισμός είναι λάθος και ακολουθείς από την αρχή χωρίς αλλαγές αυτόν το συλλογισμό οπότε δεν βρίσκεις τη λύση.

Το ότι σου βγαίνει στο 2ο αρχείο ο χρόνος σωστός, είναι θέμα σύμπτωσης. Δεν είναι απόδειξη ορθότητας της μεθόδου.

Πρέπει να αξιοποιήσεις το ΜΕΓΕΘΟΣ των αρχείων με κάποιο τρόπο.

Άβαταρ μέλους
Κηπουρίδης
Δημοσιεύσεις: 360
Εγγραφή: Παρ Φεβ 05, 2010 5:05 pm

Re: Hellenico

Δημοσίευση από Κηπουρίδης »

switch έγραψε:
Παρ Ιούλ 24, 2020 6:45 pm
Δεν μας κουράζεις. Και εμείς χαιρόμαστε όταν βοηθάμε, όπως μας βοήθησαν και εμάς.
Ολόσωστος!!!
_Dimitris_ έγραψε:
Παρ Ιούλ 24, 2020 6:59 pm
Δεν έχει να κάνει με προγραμματισμό το μπέρδεμά μου αλλά με τη λογική, το τι πρέπει να κάνω.
Αγαπητέ Δημήτρη, ακριβώς αυτός είναι ο λόγος που δε σου δίνουμε ξεκάθαρα την απάντηση, γιατί τη λογική πρέπει να την βρεις εσύ. Θα σου απαντούσαμε ξεκάθαρα μόνο στην αντίθετη περίπτωση, όπου ήταν σωστή η λογική σου, κι απλά είχε κάποιο bug ο κώδικας.

Εν προκειμένω η εκφώνηση του προβλήματος ζητάει κάθε χρονική στιγμή να χρησιμοποιείς όλο το bandwidth που σου δίνεται (θα ήταν ανόητο να έχεις bandwidth 100kbps και να χρησιμοποιείς μόνο τα 20, για παράδειγμα). Δεν ξεκαθαρίζει πώς θα κατανείμεις το bandwidth μετά το τέλος του κατεβάσματος ενός αρχείου, διότι δε χρειάζεται να το κάνει. Διότι με όποιο τρόπο και να το κατανείμεις, το ίδιο αποτέλεσμα θα πάρεις.

Σκέψου το εξής (απλοϊκό) παράδειγμα. Θες να τερματίσεις 2 παιχνίδια, για το πρώτο χρειάζεσαι μία ώρα, για το δεύτερο χρειάζεσαι δύο ώρες. Ζητείται ο ελάχιστος χρόνος να τα τερματίσεις (!). Μία λογική θα ήταν να τερματίσεις πρώτα το πρώτο, και μετά το δεύτερο (1+2=3 ώρες). Μία άλλη λογική θα ήταν να τερματίσεις πρώτα το δεύτερο και μετά το πρώτο (2+1=3 ώρες). Μία άλλη λογική θα ήταν να τερματίσεις πρώτα το μισό από το πρώτο παιχνίδι, μετά ολόκληρο το δεύτερο, και μετά το άλλο μισό του πρώτου παιχνιδιού (0.5+2+0.5=3 ώρες). Και οι τρεις λογικές (μα και πολλές ακόμα) είναι σωστές, κι όλες θα δώσουν το ίδιο αποτέλεσμα (3 ώρες). Άρα θα ήταν λάθος η εκφώνηση να ξεκαθαρίσει ακριβώς ποια στρατηγική θα ακολουθήσω, αυτό αφήνεται σε εμάς.

Στο πρόβλημά μας, και πάλι πολλές λογικές είναι σωστές. Αρκεί να είναι συνεπείς. Δηλαδή να συνεχίσεις να δίνεις 100kbps κάθε στιγμή (ως παράδειγμα λέω το 100, εξαρτάται από το κάθε testcase). Το πρόβλημα με τις πράξεις που μας περιγράφεις είναι ότι 'αντιστοιχούν' σε 'λύσεις' που δίνουν περισσότερο από 100kbps κάποιες χρονικές στιγμές!

Για αυτό γινόμαστε πρήχτες με τον switch και σου λέμε ότι πρέπει πρώτα να μας περιγράψεις ΤΙ θες να κάνεις. Δηλαδή τι κατανομή του bandwidth σου θα κάνεις όταν τελειώσει το κατέβασμα ενός αρχείου, ώστε να είσαι συνεπής στο μοναδικό περιορισμό (κάθε στιγμή να χρησιμοποιείς όλο το bandwidth); Αν μας το εξηγήσεις αυτό, τότε θα μπορούμε πιο εύκολα:
Α) Να συζητήσουμε αν είναι πράγματι συνεπής η κατανομή σου.
Β) Αν πράγματι ο κώδικάς σου κάνει αυτό που θα ήθελες.

Και πάλι, το μυαλό είναι εύκολο να κολλήσει στα πιο απρόσμενα σημεία, πάρε όσο χρόνο χρειαστείς για να καταλάβεις τι γίνεται, δεν είναι αγώνας δρόμου... πίστεψέ με, έχω κολλήσει σε απείρως απλούστερα πράγματα!

Καλή σου συνέχεια και καλή επιτυχία.
Λύσεις θεμάτων ΠΔΠ: https://pdp-archive.github.io/
Μπούσουλας διαβάσματος ΠΔΠ: http://snf-800715.vm.okeanos.grnet.gr/PDP/
Tutorials: https://kallinikos.github.io/
Επίσημο forum ΠΔΠ: https://www.pdpforum.eu.org/forum/

_Dimitris_
Δημοσιεύσεις: 32
Εγγραφή: Τετ Ιούλ 22, 2020 4:55 pm

Re: Hellenico

Δημοσίευση από _Dimitris_ »

Κηπουρίδης έγραψε:
Σάβ Ιούλ 25, 2020 1:38 am
switch έγραψε:
Παρ Ιούλ 24, 2020 6:45 pm
Δεν μας κουράζεις. Και εμείς χαιρόμαστε όταν βοηθάμε, όπως μας βοήθησαν και εμάς.
Ολόσωστος!!!
_Dimitris_ έγραψε:
Παρ Ιούλ 24, 2020 6:59 pm
Δεν έχει να κάνει με προγραμματισμό το μπέρδεμά μου αλλά με τη λογική, το τι πρέπει να κάνω.
Αγαπητέ Δημήτρη, ακριβώς αυτός είναι ο λόγος που δε σου δίνουμε ξεκάθαρα την απάντηση, γιατί τη λογική πρέπει να την βρεις εσύ. Θα σου απαντούσαμε ξεκάθαρα μόνο στην αντίθετη περίπτωση, όπου ήταν σωστή η λογική σου, κι απλά είχε κάποιο bug ο κώδικας.

Εν προκειμένω η εκφώνηση του προβλήματος ζητάει κάθε χρονική στιγμή να χρησιμοποιείς όλο το bandwidth που σου δίνεται (θα ήταν ανόητο να έχεις bandwidth 100kbps και να χρησιμοποιείς μόνο τα 20, για παράδειγμα). Δεν ξεκαθαρίζει πώς θα κατανείμεις το bandwidth μετά το τέλος του κατεβάσματος ενός αρχείου, διότι δε χρειάζεται να το κάνει. Διότι με όποιο τρόπο και να το κατανείμεις, το ίδιο αποτέλεσμα θα πάρεις.

Σκέψου το εξής (απλοϊκό) παράδειγμα. Θες να τερματίσεις 2 παιχνίδια, για το πρώτο χρειάζεσαι μία ώρα, για το δεύτερο χρειάζεσαι δύο ώρες. Ζητείται ο ελάχιστος χρόνος να τα τερματίσεις (!). Μία λογική θα ήταν να τερματίσεις πρώτα το πρώτο, και μετά το δεύτερο (1+2=3 ώρες). Μία άλλη λογική θα ήταν να τερματίσεις πρώτα το δεύτερο και μετά το πρώτο (2+1=3 ώρες). Μία άλλη λογική θα ήταν να τερματίσεις πρώτα το μισό από το πρώτο παιχνίδι, μετά ολόκληρο το δεύτερο, και μετά το άλλο μισό του πρώτου παιχνιδιού (0.5+2+0.5=3 ώρες). Και οι τρεις λογικές (μα και πολλές ακόμα) είναι σωστές, κι όλες θα δώσουν το ίδιο αποτέλεσμα (3 ώρες). Άρα θα ήταν λάθος η εκφώνηση να ξεκαθαρίσει ακριβώς ποια στρατηγική θα ακολουθήσω, αυτό αφήνεται σε εμάς.

Στο πρόβλημά μας, και πάλι πολλές λογικές είναι σωστές. Αρκεί να είναι συνεπείς. Δηλαδή να συνεχίσεις να δίνεις 100kbps κάθε στιγμή (ως παράδειγμα λέω το 100, εξαρτάται από το κάθε testcase). Το πρόβλημα με τις πράξεις που μας περιγράφεις είναι ότι 'αντιστοιχούν' σε 'λύσεις' που δίνουν περισσότερο από 100kbps κάποιες χρονικές στιγμές!

Για αυτό γινόμαστε πρήχτες με τον switch και σου λέμε ότι πρέπει πρώτα να μας περιγράψεις ΤΙ θες να κάνεις. Δηλαδή τι κατανομή του bandwidth σου θα κάνεις όταν τελειώσει το κατέβασμα ενός αρχείου, ώστε να είσαι συνεπής στο μοναδικό περιορισμό (κάθε στιγμή να χρησιμοποιείς όλο το bandwidth); Αν μας το εξηγήσεις αυτό, τότε θα μπορούμε πιο εύκολα:
Α) Να συζητήσουμε αν είναι πράγματι συνεπής η κατανομή σου.
Β) Αν πράγματι ο κώδικάς σου κάνει αυτό που θα ήθελες.

Και πάλι, το μυαλό είναι εύκολο να κολλήσει στα πιο απρόσμενα σημεία, πάρε όσο χρόνο χρειαστείς για να καταλάβεις τι γίνεται, δεν είναι αγώνας δρόμου... πίστεψέ με, έχω κολλήσει σε απείρως απλούστερα πράγματα!

Καλή σου συνέχεια και καλή επιτυχία.
Είμαι εντυπωσιασμένος από την επιμονή σας να με βοηθήσετε, σας είμαι ευγνώμων. Λοιπόν όσον αφορά την πράξη του bandwidth τώρα. Πάντα διαιρώ με το συνολικό bandwidth (/100) σε μια πράξη, πχ στο δεύτερο αρχείο (20-10)*20/100 πάντα διαιρώ με όλο το bandwidth, το οποίο είναι σταθερό από την αρχή. Διαιρώ λοιπόν τα kilobytes με το kilobytes/second. Η μονάδα που μένει είναι όντως δευτερόλεπτα αλλά μήπως κάνω λάθος την αφαίρεση; Μήπως δεν θα έπρεπε να το πολλαπλασιάσω με την ταχύτητα που είχε εξαρχής (Μα αυτό δείχνει το παράδειγμα!!!) ή κάτι ξεχνώ; Η πράξη είναι ακριβώς αυτή που βλέπω στην εκφώνηση της άσκησης, δεν καταλαβαίνω τι πρέπει να κάτσω να σκεφτώ να βρω ☹️... Αφού δεν παίζει ρόλο που θα το ανακατανείμω, τότε τι γράφω λάθος στις πράξεις που έγραψα στο προηγούμενό μου μήνυμα και δεν μπορώ να καταλάβω πώς βγαίνει αυτό το 30;;;

(Υ.Γ) Δεν θα τολμούσα ποτέ να σας θεωρήσω "πρήχτες" και σας καταλαβαίνω απόλυτα. Ευχαριστώ που σας νοιάζει να το καταλάβω. Δύσκολα το βρίσκει αυτό κανείς στις μέρες μας. Οι προγραμματιστές διαπρέπουν παντού και πάντα!!!

Απάντηση