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.