Testo progetto

Transcript

Testo progetto
Progetto
Corso di Algoritmi e Strutture dati - A.A. 2016/2017
(1° appello)
Obiettivo del progetto è la soluzione del problema di seguito descritto utilizzando il sistema di
valutazione online disponibile all’indirizzo https://prototypes.mat.unical.it/asd.
Per la creazione dell’account necessario ad accedere al sistema, inserire i propri dati nel form1
raggiungibile dal sito del corso e inviare una email di conferma all’esercitatore.
Problema
Il nostro caro Cid ha vinto la precedente battaglia e si trova adesso nella sua officina a Rocket
Town. Vuole potenziare la sua aeronave e per farlo deve estrarre il potere di alcune rune
magiche chiamate Materia. Ogni Materia ha un certo potere (quantificato con un numero) e
per estrarlo da essa si usa uno strumento chiamato Mini-Mako Reactor (MMR). L’estrazione
è semplice: basta poggiare la Materia sul MMR e aspettare un tempo in secondi equivalente al
potere della Materia stessa. Cid ne ha a disposizione un numero enorme di Materia (tutte vinte
in battaglia) e per finire in fretta ha chiesto ad alcuni suoi amici di aiutarlo, fornendo ad
ognuno di loro un MMR.
Cid può chiedere ogni volta l'aiuto di un numero finito di amici. Quest'ultimi si metteranno di
fronte ad un nastro trasportatore che contiene delle Materia, messe una di seguito all’altra.
Cid ha pensato di partizionare il nastro tra i suoi amici per velocizzare il lavoro: ogni amico
sarà assegnato ad una porzione contigua del nastro e userà il suo MMR per estrarre il potere
dalle Materia contenute in quella porzione. Cid vuole rendere il lavoro imparziale: per farlo
ha pensato di partizionare il nastro, in modo tale da minimizzare il tempo totale di estrazione
che ogni amico deve impiegare per estrarre il potere dalla partizione a cui è stato assegnato.
Inoltre, non è possibile cambiare l’ordine delle Materia sul nastro, sono troppo pesanti per
essere sposate a mano. Per farlo, ha chiesto (come al solito) il nostro aiuto.
Sia M = {m1, ..., mn} una lista di Materia, dove mi è un numero intero positivo e sia p il
numero di amici disposti ad aiutare Cid. Si deve implementare un programma che indichi
come partizionare in modo imparziale la lista M utilizzando p amici e senza poter spostare le
Materie da una posizione del nastro ad un’altra. Una partizione imparziale di M utilizzando p
amici consiste in partizionare M in p parti contigue tale da minimizzare il tempo totale di
estrazione per ogni partizione, ovvero in modo che non ci sia un amico che lavori molto più di
un altro amico.
Input
La lettura dovrà avvenire da standard input.
L'input consiste in un numero i (i ≥ 1) di test, rappresentanti le varie configurazioni dei nastri;
per ogni sessione, il formato è il seguente:
- La prima riga contiene la stringa conveyor e un numero j (separati da spazio),
rappresentante l'inizio della j-esima sessione;
- La seconda riga è nel formato n p dove n è il numero di Materia presenti sul nastro e p il
numero di amici a disposizione per la j-esima sessione;
- La terza riga è nel formato m1 m2 … mn dove ogni mi è un numero intero positivo,
rappresentate il potere della i-esima Materia presente nella sessione, con ogni numero
separato da uno spazio.
Questo formato vale per tutti i test. L'input termina con la stringa -1.
Si può assumere che l'input sia sempre corretto e che non presenti alcun tipo di ambiguità.
1
La form è accessibile direttamente all’indirizzo: http://bit.ly/1IZRF43
Output
L'output del programma deve avvenire su standard output; per ogni test, l'output deve essere
nel seguente formato:
- La prima riga contiene la parola chiave result e un numero k (separati da uno spazio),
rappresentanti il k-esimo test;
- La riga successiva contiene la lista di numeri m1 m2 … mn partizionata utilizzando come
separatore il carattere | (pipeline). I separatori usati dovranno essere separati da spazio
all’interno della sequenza.
Un esempio è il seguente: supponiamo n = 6, p = 3 e che il risultato indichi che la prima
partizione sia composta dalle prime due Materia, la seconda solo dalla terza Materia e la terza
dalle restanti, allora si avrà in output
m1 m2 | m3 | m4 m4 m6
Esempio input
Esempio output
conveyor 1
6 3
20 20 20 20 20 20
conveyor 2
5 2
3 2 8 4 7
-1
result 1
20 20 | 20 20 | 20 20
result 2
3 2 8 | 4 7
Regole per la consegna e la valutazione
Il sistema consente di sviluppare le proprie soluzioni sia in C++ che in Java. La compilazione
delle soluzioni utilizzerà i seguenti compilatori:
- C++: g++ (Debian 4.4.5-8) 4.4.5;
- Java: vers. 1.6.0_26.
La consegna del progetto avviene mediante la sottomissione dello stesso sul sistema di
valutazione e sarà considerata valida solo quando il sistema darà come risultato
“CORRECT”.
Fino alla scadenza fissata per ciascun appello è possibile sottomettere un qualunque numero
di soluzioni. Sarà considerata ai fini della valutazione l’ultima sottomissione.
La valutazione del progetto consiste delle seguenti componenti:
- 5 punti se la soluzione fornita è corretta;
- da 0 a 6 punti attribuiti proporzionalmente all’efficienza della soluzione proposta dallo
studente, rispetto all’efficienza delle soluzioni proposte da tutti gli altri studenti che
partecipano al contest;
- da 0 a 6 punti relativi alla discussione del progetto in cui oltre alla padronanza del codice si
valuterà la qualità della soluzione proposta (questa fase avrà luogo solo se la soluzione
fornita è corretta).
Solo dopo la valutazione positiva del progetto lo studente sarà ammesso all’orale.