# Prefab: subtask falliti

**URL:** <https://forum.olinfo.it/t/prefab-subtask-falliti/4187>\
**Category:** Aiuto\
**Created:** [28 Novembre 2016, 7:53pm UTC](https://forum.olinfo.it/t/prefab-subtask-falliti/4187 "2016-11-28T19:53:10Z")\
**Posts on this page:** 14\
**Page:** 1

<div class="post-metadata">

**Author:** ![erolm\_a](https://forum.olinfo.it/user_avatar/forum.olinfo.it/erolm_a/32/514_2.png) [@erolm\_a](https://forum.olinfo.it/u/erolm_a)\
**Post date:** [28 Novembre 2016, 7:53pm UTC](https://forum.olinfo.it/t/prefab-subtask-falliti/4187/1 "2016-11-28T19:53:10Z")

</div>

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/](http://paste.ubuntu.com/23549997/)

Falliscono i subtask 14 e 15

---

<div class="post-metadata">

**Author:** ![marcotramontini](https://forum.olinfo.it/letter_avatar_proxy/v4/letter/m/d26b3c/32.png) [@marcotramontini](https://forum.olinfo.it/u/marcotramontini)\
**Post date:** [29 Novembre 2016, 5:14pm UTC](https://forum.olinfo.it/t/prefab-subtask-falliti/4187/2 "2016-11-29T17:14:23Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![erolm\_a](https://forum.olinfo.it/user_avatar/forum.olinfo.it/erolm_a/32/514_2.png) [@erolm\_a](https://forum.olinfo.it/u/erolm_a)\
**Post date:** [29 Novembre 2016, 10:56pm UTC](https://forum.olinfo.it/t/prefab-subtask-falliti/4187/3 "2016-11-29T22:56:28Z")

</div>

Grazie, provo subito ad aggiungere questo caso

---

<div class="post-metadata">

**Author:** ![doublechar14](https://forum.olinfo.it/user_avatar/forum.olinfo.it/doublechar14/32/426_2.png) [@doublechar14](https://forum.olinfo.it/u/doublechar14)\
**Post date:** [11 Dicembre 2016, 2:46am UTC](https://forum.olinfo.it/t/prefab-subtask-falliti/4187/4 "2016-12-11T02:46:04Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![erolm\_a](https://forum.olinfo.it/user_avatar/forum.olinfo.it/erolm_a/32/514_2.png) [@erolm\_a](https://forum.olinfo.it/u/erolm_a)\
**Post date:** [11 Dicembre 2016, 8:13pm UTC](https://forum.olinfo.it/t/prefab-subtask-falliti/4187/5 "2016-12-11T20:13:36Z")

</div>

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”

---

<div class="post-metadata">

**Author:** ![dp\_1](https://forum.olinfo.it/user_avatar/forum.olinfo.it/dp_1/32/2635_2.png) [@dp\_1](https://forum.olinfo.it/u/dp_1)\
**Post date:** [11 Dicembre 2016, 8:45pm UTC](https://forum.olinfo.it/t/prefab-subtask-falliti/4187/6 "2016-12-11T20:45:04Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![count9929A](https://forum.olinfo.it/letter_avatar_proxy/v4/letter/c/278dde/32.png) [@count9929A](https://forum.olinfo.it/u/count9929A)\
**Post date:** [25 Novembre 2017, 6:45pm UTC](https://forum.olinfo.it/t/prefab-subtask-falliti/4187/7 "2017-11-25T18:45:57Z")

</div>

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? 🙂

---

<div class="post-metadata">

**Author:** ![frakkiobello](https://forum.olinfo.it/user_avatar/forum.olinfo.it/frakkiobello/32/2768_2.png) [@frakkiobello](https://forum.olinfo.it/u/frakkiobello)\
**Post date:** [25 Novembre 2017, 8:29pm UTC](https://forum.olinfo.it/t/prefab-subtask-falliti/4187/8 "2017-11-25T20:29:07Z")

</div>

A me la soluzione ufficiale da 100  
[https://pastebin.com/QG9GQHCX](https://pastebin.com/QG9GQHCX)

---

<div class="post-metadata">

**Author:** ![count9929A](https://forum.olinfo.it/letter_avatar_proxy/v4/letter/c/278dde/32.png) [@count9929A](https://forum.olinfo.it/u/count9929A)\
**Post date:** [25 Novembre 2017, 11:36pm UTC](https://forum.olinfo.it/t/prefab-subtask-falliti/4187/9 "2017-11-25T23:36:22Z")

</div>

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à

---

<div class="post-metadata">

**Author:** ![frakkiobello](https://forum.olinfo.it/user_avatar/forum.olinfo.it/frakkiobello/32/2768_2.png) [@frakkiobello](https://forum.olinfo.it/u/frakkiobello)\
**Post date:** [26 Novembre 2017, 11:26am UTC](https://forum.olinfo.it/t/prefab-subtask-falliti/4187/10 "2017-11-26T11:26:31Z")

</div>

Hai ragione il risultato corretto è 12.

Comunque credo di essermi confuso, credo che questa fosse la mia implementazione non la soluzione ufficiale. 😊

---

<div class="post-metadata">

**Author:** ![count9929A](https://forum.olinfo.it/letter_avatar_proxy/v4/letter/c/278dde/32.png) [@count9929A](https://forum.olinfo.it/u/count9929A)\
**Post date:** [26 Novembre 2017, 12:16pm UTC](https://forum.olinfo.it/t/prefab-subtask-falliti/4187/11 "2017-11-26T12:16:32Z")

</div>

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

🤨

---

<div class="post-metadata">

**Author:** ![dp\_1](https://forum.olinfo.it/user_avatar/forum.olinfo.it/dp_1/32/2635_2.png) [@dp\_1](https://forum.olinfo.it/u/dp_1)\
**Post date:** [26 Novembre 2017, 9:55pm UTC](https://forum.olinfo.it/t/prefab-subtask-falliti/4187/12 "2017-11-26T21:55:13Z")

</div>

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? 😀

---

<div class="post-metadata">

**Author:** ![count9929A](https://forum.olinfo.it/letter_avatar_proxy/v4/letter/c/278dde/32.png) [@count9929A](https://forum.olinfo.it/u/count9929A)\
**Post date:** [26 Novembre 2017, 10:44pm UTC](https://forum.olinfo.it/t/prefab-subtask-falliti/4187/13 "2017-11-26T22:44:35Z")

</div>

😃 l’Anti-Cip 😃  
comunque malefico o meno, è sempre lui ed è una garanzia

---

<div class="post-metadata">

**Author:** ![v.bizzarri](https://forum.olinfo.it/letter_avatar_proxy/v4/letter/v/7c8e57/32.png) [@v.bizzarri](https://forum.olinfo.it/u/v.bizzarri)\
**Post date:** [2 Novembre 2018, 10:08am UTC](https://forum.olinfo.it/t/prefab-subtask-falliti/4187/14 "2018-11-02T10:08:17Z")

</div>

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.
