#include #ifdef DEBUG #include #endif #include #include #error Il programma non è completo. Si legga il sorgente per una traccia di soluzione (non realizzata per motivi di tempo). using namespace std; const int MAX_N = 10000; const int MAX_T = 100; int minYes; int rule; int q; int isAcceptable[MAX_N][2]; int c99rounder(double n) { int floored = floor(n); if (floored + 0.5 >= n) { return floored + 1; } else { return floored; } } // Idea di base: usare la programmazione dinamica o addirittura una soluzione diretta per calcolare // l'accettabilità o meno di una proposta. Dall'analisi delle // regole ricaviamo che: // - il capitano, per salvarsi (priorità più elevata), ha tutto // l'interesse a dare dei soldi al minimo numero di pirati // sufficiente per raggiungere il quorum; // - per avidità il capitano si prenderà il numero maggiore di // monete; // - gli altri pirati tendono ad accettare per salvarsi la vita // (si può vedere che per A la strategia migliore è rifiutare // sempre - in questo modo farebbe morire tutti gli altri // prendendo tutto, e si salverebbe sempre; per gli altri // conviene accettare solo non appena si ha il minimo numero // di voti sufficiente a far passare un'eventuale proposta. // In questo modo chi rimane resterebbe in vita e si eliminerebbe // il numero maggiore di "concorrenti" possibili con cui spartirsi // il bottino. // Chiaramente, per le considerazioni sul capitano, l'ottimo // sarebbe dato come segue (ipotesi): il capitano ci guadagna // (prende quasi tutto = numero monete iniziale - quelle date di // seguito), il penultimo ha l'interesse ad accettare per salvarsi // la vita, gli altri prendono 1 o 0 monete. bool isProposalAccepted(int numPirates) { // Controlla il risultato. switch (rule) { case 2: minYes = floor(numPirates / 2); break; case 3: minYes = c99rounder(numPirates / 3); break; case 4: minYes = q; break; case 1: default: minYes = c99rounder(numPirates / 2); break; } // Controlla la tabella per vedere se ci sono abbastanza voti. // Salva il risultato e restituiscilo. } int main(void) { ifstream fin("input.txt"); assert(fin); int n; // <= 10000 int t; // <= 100 fin >> n; fin >> t; fin >> rule; if (rule == 4) { fin >> q; } fin.close(); ofstream fout("output.txt"); assert(fout); // Output list of coins per pirate fout.close(); return 0; }