IOI 1995 1.2 – Offerte speciali - Olimpiadi Internazionali di Informatica

Transcript

IOI 1995 1.2 – Offerte speciali - Olimpiadi Internazionali di Informatica
IOI 1995 1.2 – Offerte speciali
Massimo Santini
1 settembre 2000
1 Problema
In un negozio ogni tipo di prodotto ha il suo prezzo. Per esempio, il prezzo di un fiore è pari a 2 LI (lire informatiche) e
il prezzo di un vaso è pari a 5 LI. Per attrarre più consumatori, il negozio introduce alcune offerte speciali.
Una offerta speciale consiste nella possibilità di acquistare uno o più prodotti per una cifra scontata. Secondo l’esempio
precedente, tre fiori a 5 LI invece che a 6 LI, oppure due vasi e un fiore a 10 LI invece che a 12 LI.
Si chiede di scrivere un programma che calcola il prezzo che un consumatore deve spendere per acquistare una certa
quantità di prodotti facendo uso ottimale delle offerte speciali, ossia spendendo il meno possibile. Non è però consentito
acquistare più di quanto richiesto allo scopo di poter approfittare di offerte migliori.
Per concludere l’esempio precedente, il (più basso) prezzo per acquistare tre fiori e due vasi è pari a 14 LI: due vasi ed
un fiore in offerta a 10 LI e due fiori a prezzo pieno per altre 4 LI.
1.1 Dati in ingresso
L’ingresso viene presentato in due file INPUT.TXT e OFFER.TXT. Il primo file descrive l’acquisto ed il costo dei vari
prodotti. Il secondo file descrive le offerte speciali. Entrambe i file contengono solamente numeri interi.
La prima linea del file INPUT.TXT contiene il numero b di differenti prodotti in vendita (0 b 5). Sulle successive
b linee sono contenuti tre numeri c, k e p e ogni riga descrive un diverso prodotto. Il valore c è il “codice del prodotto”
(diverso per ciascun prodotto, con 1 c 999). Il valore k indica la quantità di prodotto da acquistare (1 k
5).
Infine, il valore p indica il prezzo unitario (non scontato) del prodotto (1 p 999). Osservate che l’acquisto richiesto
è al più di 25 5 5 prodotti.
La prima linea del file OFFER.TXT contiene il numero s di offerte speciali (1
s
99). Sulle successive s linee
viene descritta una offerta per linea. Il primo numero di ciascuna linea, n indica il numero del tipo di prodotti in offerta
(1
n
5); di seguito sulla lina ci sono n coppie di numeri c e k che descrivono i prodotti in offerta: c indica il
codice prodotto (ed è uno dei codici che apparivano nel file INPUT.TXT) e k indica la quantità del prodotto nell’offerta
(1
k
5); l’ultimo numero sulla linea è il prezzo complessivo p dell’offerta (1
p
9999). È garantito che le
offerte siano convenienti, nel senso che il loro prezzo è inferiore alla somma del costo pieno dei prodotti in offerta.
1.2 Dati in uscita
Il file OUTPUT.TXT contiene una sola linea recante il prezzo più basso con il quale è possibile acquistare i prodotti
indicati.
1.3 Esempio
L’esempio descritto in precedenza è rappresentato dai file seguenti, dove il codice dei fiori è 7 e quello dei vasi è 8.
Il file INPUT.TXT contiene
2
1
7 3 2
8 2 5
mentre il file OFFER.TXT contiene
2
1 7 3 5
2 7 1 8 2 10
Il file OUTPUT.TXT contiene quindi il valore 14.
2 Soluzione
Attenzione: Questa soluzione è “errata” nel senso che il suo tempo di calcolo è molto elevato su alcuni input. Si veda
la soluzione proposta da Paolo Boldi che ha prestazioni molto migliori.
Assegnato il numero 1
b
5 di prodotti in vendita, rappresentiamo un possibile acquisto con un vettore a a1 a2 ab di cinque numeri interi; l’i -esima posizione di tale vettore indicherà la quantità dell’i -esimo prodotto 1
presente nell’acquisto.
I dati del problema descrivono il listino prezzi del negozio e una specifica richiesta d’acquisto che chiameremo ordine.
Per listino prezzi intendiamo l’insieme O delle offerte (speciali, o meno) assieme con una funzione p O N che
associa a ciascuna offerta il suo prezzo. Gli elementi dell’insieme O delle offerte sono degli acquisti: i singoli prodotti
saranno rappresentati da un acquisto con una sola componente pari a 1 e le altre tutte nulle, mentre le offerte speciali
saranno rappresentate da un acquisto indicante per ciascun prodotto la quantità di esso presente nell’offerta.
Secondo l’esempio (assegnando la prima componente ai fiori, con codice 7 e la seconda ai vasi, con codice 8) avremo
l’ordine corrispondente a 3 2
, il listino prezzi dato dall’insieme di offerte O 1 0
0 1
3 0
1 2
e dal
prezzo p rappresentato dalla tabella seguente
a
(1,0)
(0,1)
(3,0)
(1,2)
p(a)
2
5
5
10
In questi termini, assegnate le offerte O, il prezzo p e l’ordine a, il problema chiede di determinare il più piccolo
k
numero tale che esistono le offerte x1 x2 xk O (non necessariamente distinte) per cui2 i 1 p xi e
k
i 1 xi a.
Per risolvere il problema, faremo uso di una famiglia di insiemi che denoteremo con A , dove è un numero intero.
Definiamo A come l’insieme di acquisti possibili di costo , più formalmente:
A k
a esistono x1 x2 xk O per cui i 1
p xi e
k
i 1
xi a
Mostriamo ora come per un assegnato N, l’insieme A possa essere calcolato a partire dai dati del problema e
dagli insiemi A con . Definiamo
B a a O p a
x y !
a a
x1 "
x2 x1 B x x2 B y #
ossia B contiene le offerte che hanno prezzo e gli acquisti che possono essre fatti sommando un acquisto di costo
x ed uno di costo y per tutti gli x, y, tali che x " y $ . É ovvio che ogni B può essere costruito a partire dai dati
del problema e da B con %&' ; osserviamo inoltre che è semplice provare che B )( A , per ogni N. Se
1 Possiamo pensare ai prodotti ordinati per numero di codice.
2 Se x e x sono vettori, con x
1
2
1 * x2 si intende il vettore la cui componente i-esima è la somma delle componenti i-esime di x1 e x2 ; con il
y
simbolo +
i , x si intende la somma di tutti i temini ottenuti per i che va da x a y.
2
valesse A -( B avremmo A B e, per le proprietà di B avremmo un modo di calcolare A . Sapendo
calcolare gli insiemi A per N, la soluzione del problema consisterebbe semplicemente nel determinare il minimo
tale che a A .
Proviamo quindi, per induzione su che vale A .( B . Sia 0 il prezzo minimo nel listino, ovvero sia 0 il più
piccolo intero tale che esiste un offerta x O tale che p x 0 ; evidentemente per tutti i /0 0 si avrà A 21 . La
base dell’induzione è elementare e consiste nell’osservare che A 0 coincide con l’insieme che compare subito dopo
l’uguale nella definizione di B 0 .
Assumiamo quindi 435 0 e, per ipotesi di induzione, sia A x 6( B x per ogni x 2 . Consideriamo un acquisto
a A , esso può essere costituito da una singola offerta, nel qual caso sarà in B (precisamente, ancora grazie
all’insieme che compare subito dopo l’uguale nella definizione di B ), oppure sarà costituito dalla somma di più
offerte x1 x2 xk O per cui ki 1 xi a.
k
In questo caso “dividiamo” l’acquisto in due parti: consideriamo ad esempio gli acquisiti a1 x1 e a2 i 2 xi
k
x
.
Per
definizione
avremo
a
A
x
e
a
e i loro prezzi x p a1 p x1
e y p a2 p
i
1
2
A y
.
i 2
Ovviamente x 7 e y 7 , quindi, per ipotesi induttiva, avremo a1 B x e a2 B y . Essendo inoltre 8 x " y,
per definizione di B , si avrà a a1 " a2 B .
2.1 Dettagli implementativi
Facciamo qualche osservazione: la soluzione proposta richiede di calcolare gli insiemi da A 0 al primo A % per cui
l’ordine a A . Se ci sono b tipi di prodotti a listino, e l’ordine richiede al più k prodotti di ciascun tipo, ci saranno
al più k b acquisti possibili. Questo stabilisce un limite superiore3 per la grandezza di ciascun A .
Per calcolare A dobbiamo valutare l’unione delle “somme” di A x e A y su tutti i prezzi x e y tali che 9 x " y,
;:
ossia sui prezzi4 1 x
%< 2= e y 58> x, quindi su un numero di unioni dell’ordine di < 2. Per quanto osservato
in precedenza, ciascun termine dell’unione è composto al più da k b 2 somme (di cui solo k b possono risultare distinte).
A loro volta, A x e A y dovranno essere calcolati a partire da insiemi relativi a prezzi più bassi. Si può provare
(risolvendo una equazione di ricorrenza) che il calcolo di A richiede un numero di operazioni 5 dell’ordine di k b 2 .
Dati i vincoli su b e k espressi nella descrizione del problema, avremo in ciascun insieme al più 55 3125 acquisti,
qundi il calcolo di A richiede un numero di opreazioni dell’ordine di 2 per una costante pari a 31252 9765625. Il
prezzo massimo è 25 999, pari al numero massimo di prodotti acquistabili per il massimo prezzo di ciascuno. Il numero
massimo di opreazioni richieste, quindi, è dell’ordine di 9765625 25 999
2 6091314697265625 6 1 1015 .
Questo numero, pur essendo una stima grossolana, è molto elevato, non è quindi escluso che la soluzione non possa essre
calcolata in tempo ragionevole. Ad ogni modo, si impone che nell’implementazione vengano attuati degli espedienti atti
a ridurre al minimo possibile la cardinalità degli A e a rendere efficiente la somma di due acquisti, che è l’operazione
più frequente.
Il contenuto di questo documento è protetto dalle leggi sul copyright e dalle disposizioni dei trattati internazionali. Questo documento può essere copiato (o comunque riprodotto) ed utilizzato liberamente dagli studenti, dagli istituti di
ricerca, scolastici ed universitari afferenti ai Ministeri della Pubblica Istruzione e dell’Università e della Ricerca Scientifica e Tecnologica per scopi istituzionali, non a fine di lucro. Ogni altro utilizzo o riproduzione (ivi incluse, ma non
limitatamente a, le riproduzioni a mezzo stampa, su supporti magnetici o su reti di calcolatori) in toto o in parte è vietata, se non esplicitamente autorizzata per iscritto, a priori, da parte dell’autore.
L’informazione contenuta in questo documento è ritenuta essere accurata alla data della pubblicazione. Essa è fornita per scopi meramente didattici e non per essere utilizzata in progetti di impianti, prodotti, ecc. L’informazione contenuta
in questo documento è soggetta a cambiamenti senza preavviso. L’autore non si assume alcuna responsabilità per il contenuto di queste pagine (ivi incluse, ma non limitatamente a, la correttezza, completezza, applicabilità ed aggiornamento
dell’informazione). In ogni caso non può essere dichiarata conformità all’informazione contenuta in queste pagine. In ogni caso questa nota di copyright non deve mai essere rimossa e deve essere riportata anche in utilizzi parziali.
Copyright 2000 Massimo Santini
3 Addirittura, poiché nel calcolo compaiono solo somme di termini positivi, potremo cancellare da A?A@CB tutti gli acquisti che anche in una sola
posizione superano il numero di prodotti di quel tipo indicati nell’ordine, infatti nessuno di essi potrà essere assomato ad altri acquisti risultando
compatibile con l’ordine.
4 Con D x E intendiamo l’intero più grande minore, o uguale a x.
5 Considerando una singola operazione, ad esempio, il confronto o la somma di due vettori con b componenti. Questo è giustificato dal fatto che
nell’implementazione ciascun acquisto sarà rappresentato da un solo numero intero.
3