Prefab è un problema semplicissimo, ne prendo atto, e anzi sono il primissimo a dirlo. Peccato che nonostante la mia sfacciataggine e presunzione non riesca a ottenere 100/100.
http://paste.ubuntu.com/23549997/
Falliscono i subtask 14 e 15
Prefab è un problema semplicissimo, ne prendo atto, e anzi sono il primissimo a dirlo. Peccato che nonostante la mia sfacciataggine e presunzione non riesca a ottenere 100/100.
http://paste.ubuntu.com/23549997/
Falliscono i subtask 14 e 15
Ciao,
La tua soluzione è corretta, ma non hai considerato un caso.
Questa riga è valida solo se il lato maggiore del tetto è più grande del lato maggiore della casa (ovvero a sporgere è il lato maggiore del tetto):
return ((X - A) / 2 + (X - A) % 2) * Y;
Ma se invece a sporgere fosse il lato minore del tetto?
Grazie, provo subito ad aggiungere questo caso
Ragazzi avrei bisogno di un chiarimento…
Avevo scritto questo codice per i casi in cui ci fosse un solo lato che va fuori (X > A o Y > B).
if (X > A && Y <= B) { return (Y * ((X-A+1) / 2)); } else if (Y > B && X <= A) { return (X * ((Y-B+1) / 2)); }
Io non avevo messo i “+1”, che però nella soluzione corretta ci sono.
Non riesco a capire a cosa servono perché nell’esempio non è necessario (il risultato è sempre 40), qualche idea?
In realtà il “+1” a prescindere è sbagliato quanto la sua assenza.
Mettiamo che A e B sono 20 e 30, mentre X e Y sono 23 e 30 (supponendo sempre che A < B e X < Y, si scambiano in caso contrario): la presenza di un numero dispari comporta che la divisione per 2 provochi un troncamento, e quindi ti darebbe come risultato, senza aggiungere 1, (23 - 20)/2 * 30, ovvero 30, ma in realtà è 60 perché devi sempre prendere, tra 2 eccedenze, quella maggiore (e le misure sono sempre intere), di conseguenza avresti dovuto arrotondare quel 23 al prossimo numero pari.
Prova a modificare quel “+1” con “+qualcosachetiserve%2”
Il +1 serve per arrotondare per eccesso il risultato della divisione per 2, per ottenere l’area della sezione più grande in caso di lunghezza in eccesso dispari.
(N + 1) / 2 = ceil(N / 2)
Se N è pari il risultato sarà N / 2 perchè il ,5 risultante dal +1 verrebbe ignorato, se N è dispari il risultato sarà N / 2 + 0.5, arrotondando per eccesso il ,5.
Dario
ciao,
penso che il testcase #12 sia scorretto. Ho provato 3 soluzioni fatte indipendentemente (una fatta da me in Pascal, una fatta da Cip666 in C++ e la soluzione ufficiale scaricata dal sito OIS) e tutte falliscono.
Ho ottenuto 100/100 con una soluzione che considero scorretta, cioè nel caso in cui Y <= A < X e B<Y si considera uno solo dei due orientamenti possibili, mentre penso si debba provarli entrambi.
Qualcuno può controllare?
grazie!
non conoscevo questa soluzione, ma conferma la mia idea che il testcase 12 sia sbagliato.
A meno che non abbia capito male il problema, s’intende.
Infatti secondo me la soluzione ufficiale che mi hai indicato è errata. Infatti essa, se l’input è:
2 6 4 8
da come risultato 20 (ovvero la differenza tra le aree, ottenuta orientando il blocco superiore in modo da ricoprire completamente quello inferiore).
Invece (se ho interpretato bene il testo del problema ) il risultato corretto è 12, ottenuto disponendo i due blocchi “a croce”, cosa che in questo caso è possibile in quanto 6>4, mentre la soluzione ufficiale non prova questa possibilità
Hai ragione il risultato corretto è 12.
Comunque credo di essermi confuso, credo che questa fosse la mia implementazione non la soluzione ufficiale.
ah ok.
Comunque, poco importa in realtà la soluzione ufficiale, il problema vero è che il testcase secondo me è scorretto:
la soluzione, che calcola un risultato errato per l’istanza “2 6 4 8” prende 100/100
due soluzioni che calcolano il risultato corretto per “2 6 4 8” prendono 60/100
Anche con la mia soluzione succede la stessa cosa, l’unico modo per ottenere 100 è stato quello di sottoporre la soluzione “sbagliata” che considera un solo orientamento. Btw, Cip666 è la versione malefica di Cip999 o è solo un typo?
l’Anti-Cip
comunque malefico o meno, è sempre lui ed è una garanzia
Anche la mia soluzione sbaglia solo il test case 12 e prende 60/100 inoltre con l’input “2 6 4 8” da come risultato 12.