Advertisement
Guest User

OIS Poker

a guest
Nov 25th, 2018
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.13 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <assert.h>
  3. #include <algorithm>
  4. #include <string.h>
  5.  
  6. #define DEBUB_NO
  7. // SET #define DEBUB to run debug
  8.  
  9. typedef struct {
  10.     int giornoTorneo;
  11.     int oraInizio;
  12.     int oraFine;
  13.     int costoIscrizione;
  14.     int premio;
  15. } Tournament;
  16.  
  17. bool operator == (const Tournament, const Tournament);
  18. bool isOverlapping(Tournament, Tournament);
  19. Tournament getHighestAward(Tournament, Tournament);
  20. bool byDateTime(Tournament, Tournament);
  21. bool canDo(Tournament, int);
  22.  
  23. int main(void) {
  24.     // Input redirection
  25.     freopen("input.txt", "r", stdin);
  26.     freopen("output.txt", "w", stdout);
  27.  
  28.     /**
  29.         Numero di tornei disponibili
  30.     **/
  31.     int tournamentsAmount;
  32.     assert(1 == scanf("%d", &tournamentsAmount));
  33.  
  34.     /**
  35.         Denaro utilizzabile per l'iscrizione ai tornei
  36.     **/
  37.     int currentBalance;
  38.     assert(1 == scanf("%d", &currentBalance));
  39.  
  40.     /**
  41.         Tornei disponibili ( VLA )
  42.     **/
  43.     Tournament availableTournaments[tournamentsAmount];
  44.     for (int i = 0; i < tournamentsAmount; i++) {
  45.         assert(5 == scanf("%d%d%d%d%d",
  46.             &availableTournaments[i].giornoTorneo,
  47.             &availableTournaments[i].oraInizio,
  48.             &availableTournaments[i].oraFine,
  49.             &availableTournaments[i].costoIscrizione,
  50.             &availableTournaments[i].premio
  51.         ));
  52.     }
  53.  
  54.     /**
  55.         Ordiniamo i torneo per data e ora
  56.     **/
  57.     std::sort(availableTournaments, availableTournaments + tournamentsAmount, byDateTime);
  58.  
  59. #ifdef DEBUB
  60.     printf("Sorted array: \n");
  61.     for (int i = 0; i < tournamentsAmount; i++)
  62.         printf("%d %d %d %d %d\n",
  63.             availableTournaments[i].giornoTorneo,
  64.             availableTournaments[i].oraInizio,
  65.             availableTournaments[i].oraFine,
  66.             availableTournaments[i].costoIscrizione,
  67.             availableTournaments[i].premio
  68.         );
  69.     printf("\n");
  70. #endif
  71.  
  72.     bool dayChanged = false;
  73.  
  74.     // Tournament earning array
  75.     int tournamentValues[tournamentsAmount];
  76.     memset(tournamentValues, 0, sizeof(tournamentValues));
  77.  
  78.     int firstDailyTournament = 0;
  79.     int currentDailyTurnament = 0;
  80.  
  81.     /**
  82.     * Inizializziamo il guadagno del primo torneo
  83.     */
  84.     if (canDo(availableTournaments[0], currentBalance)) {
  85.         tournamentValues[0] =
  86.             currentBalance
  87.             + availableTournaments[0].premio
  88.             - availableTournaments[0].costoIscrizione;
  89.     }
  90.     else {
  91.         tournamentValues[0] = -1;
  92.     }
  93.  
  94.     int currentDay = availableTournaments[0].giornoTorneo;
  95.  
  96.     int currentBalanceBackup = currentBalance;
  97.     /**
  98.     *  Per ogni torneo:
  99.     *       Se siamo nello stesso giorno:
  100.     */
  101.     for (int currentTournament = 1; currentTournament < tournamentsAmount; currentTournament++) {
  102. #ifdef DEBUB
  103.         printf("Looping %d [ %d ]\n", currentBalance, currentTournament);
  104. #endif
  105.         //controllo se il giorno è cambiato
  106.         if (availableTournaments[currentTournament].giornoTorneo !=
  107.             currentDay) {
  108.             dayChanged = true;
  109.             currentDay = availableTournaments[currentTournament].giornoTorneo;
  110.         }
  111.        
  112.         //controllo quanto ho guadagnato il giorno prima
  113.         if (tournamentValues[currentTournament - 1] > currentBalance) {
  114.             currentBalance = tournamentValues[currentTournament - 1];
  115.         }
  116.  
  117.         //se il giorno è cambiato allora setto manualmente il value del primo torneo del giorno.
  118.         if (dayChanged) {
  119.             currentBalanceBackup = currentBalance;
  120.             if (canDo(availableTournaments[currentTournament], currentBalance)) {
  121.                 tournamentValues[currentTournament] =
  122.                     currentBalance
  123.                     + availableTournaments[currentTournament].premio
  124.                     - availableTournaments[currentTournament].costoIscrizione;
  125.             }
  126.             else {
  127.                 tournamentValues[currentTournament] = -1;
  128.             }
  129.             firstDailyTournament = currentTournament;
  130.             /** TODO remove continue **/
  131.             dayChanged = false;
  132.             currentDay = availableTournaments[currentTournament].giornoTorneo;
  133.             continue;
  134.         }
  135.  
  136.         //BACKTRACKING
  137.         for (currentDailyTurnament = firstDailyTournament;
  138.             currentDailyTurnament < currentTournament;
  139.             currentDailyTurnament++) {
  140.  
  141. #ifdef DEBUB
  142.             for (int i = 0; i < tournamentsAmount; i++)
  143.                 printf("FOR IN: %d [%d]\n", tournamentValues[i], i);
  144. #endif    
  145.             //se non si overlappano allora controllo quanto mi fa guadagnare questa catena se mi fa guadagnare di pi� l'i-esima catena si aggiorna di valore
  146.             if (!isOverlapping(availableTournaments[currentTournament], availableTournaments[currentDailyTurnament])) {
  147.  
  148.                 if (tournamentValues[currentDailyTurnament] != -1) {
  149.  
  150. #ifdef DEBUB
  151.                     for (int i = 0; i < tournamentsAmount; i++)
  152.                         printf("BACKTRACK: %d [%d]\n", tournamentValues[i], i);
  153. #endif
  154.  
  155.                     int hipValue = tournamentValues[currentDailyTurnament]
  156.                         + availableTournaments[currentTournament].premio
  157.                         - availableTournaments[currentTournament].costoIscrizione;
  158.  
  159.                     if (hipValue > tournamentValues[currentTournament])
  160.                         tournamentValues[currentTournament] = hipValue;
  161.                 }
  162.                 else {
  163.                     if (canDo(availableTournaments[currentTournament], currentBalanceBackup)) {
  164.                         int hipValue =  currentBalanceBackup
  165.                         + availableTournaments[currentTournament].premio
  166.                         - availableTournaments[currentTournament].costoIscrizione;
  167.                         if(hipValue >= tournamentValues[ currentTournament ])
  168.                         tournamentValues[ currentTournament ] = hipValue;
  169.                     }
  170.                     else {
  171.                         tournamentValues[currentTournament] = -1;
  172.                     }
  173.                 }
  174.             }
  175.             else {
  176.                 if (canDo(availableTournaments[currentTournament], currentBalanceBackup)) {
  177.                     int hipValue =  currentBalanceBackup
  178.                         + availableTournaments[currentTournament].premio
  179.                         - availableTournaments[currentTournament].costoIscrizione;
  180.                     if(hipValue >= tournamentValues[ currentTournament ])
  181.                         tournamentValues[ currentTournament ] = hipValue;                  
  182.                 }
  183.                 else {
  184.                     tournamentValues[currentTournament] = -1;
  185.                 }
  186.             }
  187.         }
  188.     }
  189.  
  190.     // Last item
  191. #ifdef DEBUB
  192.     printf("ARRAY VALUES\n");
  193.     for (int i = 0; i < tournamentsAmount; i++)
  194.         printf("%d [%d]| ", tournamentValues[i], i);
  195. #endif
  196.  
  197.     if (tournamentValues[tournamentsAmount - 1] > currentBalance) {
  198.         currentBalance = tournamentValues[tournamentsAmount - 1];
  199.     }
  200.     /**
  201.         Restituisco ciò che ho guadagnato
  202.     **/
  203.     printf("%d\n", currentBalance);
  204.     return 0;
  205. }
  206.  
  207. bool isOverlapping(Tournament t1, Tournament t2) {
  208.     /**
  209.         Verifica se tra 2 tornei c'è una collisione di orari e giornata
  210.     **/
  211.     if (t1.giornoTorneo == t2.giornoTorneo)
  212.         return t1.oraInizio < t2.oraFine && t2.oraInizio < t1.oraFine;
  213.     return false;
  214. }
  215.  
  216. bool canDo(Tournament t1, int currentBalance) {
  217.     return t1.costoIscrizione <= currentBalance;
  218. }
  219.  
  220. Tournament getHighestAward(Tournament t1, Tournament t2) {
  221.     /**
  222.         Calcola tra i 2 tornei quello pi� proficuo
  223.     **/
  224.     int awardT1 = t1.premio - t1.costoIscrizione;
  225.     int awardT2 = t2.premio - t2.costoIscrizione;
  226.  
  227.     if (awardT1 > awardT2)
  228.         return t1;
  229.     return t2;
  230. }
  231.  
  232. bool operator == (const Tournament t1, const Tournament t2) {
  233.     if (t1.giornoTorneo == t2.giornoTorneo      &&
  234.         t1.oraInizio == t2.oraInizio         &&
  235.         t1.oraFine == t2.oraFine           &&
  236.         t1.costoIscrizione == t2.costoIscrizione   &&
  237.         t1.premio == t2.premio)
  238.         return true;
  239.     return false;
  240. }
  241.  
  242. bool byDateTime(Tournament t1, Tournament t2) {
  243.     if (t1.giornoTorneo == t2.giornoTorneo) {
  244.         if (t1.oraFine == t2.oraFine)
  245.             return t1.oraInizio < t2.oraInizio;
  246.         return t1.oraFine < t2.oraFine;
  247.     }
  248.     return t1.giornoTorneo < t2.giornoTorneo;
  249. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement