Computer Programming Contest Preparation

ToolBox - Source for: 102/10258/josh.c



/home/toolbox/public_html/solutions/102/10258/josh.c
    1 #include <stdio.h>
    2 #include <string.h>
    3 #include <sys/types.h>
    4 #include <sys/stat.h>
    5 #include <fcntl.h>
    6 #include <stdlib.h>
    7 #include <math.h>
    8 #include <stdint.h>
    9 
   10 #define TRUE  (1 == 1)
   11 #define FALSE (1 != 1)
   12 
   13 #define DEBUG if (FALSE)
   14 
   15 #define MAXBUFF 500
   16 #define MAXTEAM 100
   17 #define MAXPROB 9
   18 
   19 typedef struct
   20 {
   21     int num;
   22     int solved;
   23     int time;
   24 } teamStruct;
   25 
   26 /* fprintf(stderr, "functionName: message", varslist); */
   27 
   28 /*
   29  *  Author: Josh Abadie and Isaac Traxler
   30  *    Date: 2008 3 10
   31  * Purpose:
   32  * Problem: 10258 - Contest Scoreboard
   33  */
   34 
   35 /*
   36  * This template reads data a specified number of times.
   37  */
   38 
   39 int numberOfTimes;
   40 int contestArray[MAXTEAM+1][MAXPROB+1];
   41 int teamUsed[MAXTEAM+1];
   42 teamStruct results[MAXTEAM+1];
   43 int numCompeting = 0;
   44 
   45 
   46 int compare(const void *p1, const void *p2)
   47 {
   48     /* FUNCTION compare */
   49     teamStruct * t1, * t2;
   50     int retval;
   51 
   52     t1 = (teamStruct *)p1;
   53     t2 = (teamStruct *)p2;
   54 
   55     if (t1->solved > t2->solved)
   56         {
   57             /* t1 better */
   58             retval = -1;
   59         } /* t1 better */
   60     else if (t1->solved < t2->solved)
   61         {
   62             /* t2 better */
   63             retval = 1;
   64         } /* t2 better */
   65     else if (t1->time > t2->time)
   66         {
   67             /* t2 better by points */
   68             retval = 1;
   69         } /* t2 better by points */
   70     else if (t1->time < t2->time)
   71         {
   72             /* t1 better by points */
   73             retval = -1;
   74         } /* t1 better by points */
   75     else if (t1->num > t2->num)
   76         {
   77             /* t2 lower team number */
   78             retval = 1;
   79         } /* t2 lower team number */
   80     else
   81         {
   82             /* t1 lower team number */
   83             retval = -1;
   84         } /* t1 lower team number */
   85 
   86     return retval;
   87 } /* FUNCTION compare */
   88 
   89 void init()
   90 {
   91     /* FUNCTION init */
   92     scanf("%d ", &numberOfTimes);
   93 } /* FUNCTION init */
   94 
   95 void dump()
   96 {
   97     /* FUNCTION dump */
   98     int i, j;
   99     printf ("START CASE\n");
  100     for ( i = 0; i < MAXTEAM; i ++)
  101         {
  102             if (0 != teamUsed[i])
  103                 {
  104                     printf("Team %d:", i);
  105                     for ( j = 0; j < MAXPROB; j ++)
  106                         {
  107                             printf(" (%d:%d)", j, contestArray[i][j]);
  108                         }
  109                     printf("\n");
  110                 }
  111         }
  112 } /* FUNCTION dump */
  113 
  114 void dump1()
  115 {
  116     /* FUNCTION dump1 */
  117     int i;
  118 
  119     for (i = 0; i < numCompeting; i ++)
  120         {
  121             printf("%d: %d %d %d\n", i, results[i].num, results[i].solved, results[i].time);
  122         }
  123 } /* FUNCTION dump1 */
  124 
  125 void dump2()
  126 {
  127     /* FUNCTION dump2 */
  128     int i;
  129 
  130     for (i = 0; i < numCompeting; i ++)
  131         {
  132             printf("%d %d %d\n", results[i].num, results[i].solved, results[i].time);
  133         }
  134 } /* FUNCTION dump2 */
  135 
  136 void getInput()
  137 {
  138     /* FUNCTION getInput */
  139     char buffer[MAXBUFF];
  140     int team, prob, time;
  141     char type;
  142     int i, j;
  143 
  144     for (i = 0; i < MAXTEAM; i ++)
  145         {
  146             teamUsed[i] = 0;
  147             for (j = 0; j < MAXPROB; j ++)
  148                 {
  149                     contestArray[i][j] = 0;
  150                 }
  151         }
  152     numCompeting = 0;
  153 
  154     fgets(buffer, MAXBUFF-10, stdin);
  155     while (buffer[0] != '\n' && !feof(stdin) )
  156         {
  157             /*get input*/
  158             sscanf(buffer, "%d %d %d %c", &team, &prob, &time, &type);
  159             DEBUG printf("team:%d prob:%d time:%d type:%c\n", team, prob, time, type);
  160 
  161             teamUsed[team] = 1;
  162             switch (type)
  163                 {
  164                 /* switch */
  165                 case 'C' :
  166                     if (-1 < contestArray[team][prob])
  167                         {
  168                             contestArray[team][prob] = -(contestArray[team][prob] + time);
  169                         }
  170                     break;
  171                 case 'I' :
  172                     if (-1 < contestArray[team][prob])
  173                         {
  174                             contestArray[team][prob] = contestArray[team][prob] + 20;
  175                         }
  176                 default :
  177                     break;
  178                 } /* switch */
  179 
  180             fgets(buffer, MAXBUFF-10, stdin);
  181         }/*get input*/
  182 } /* FUNCTION getInput */
  183 
  184 void process()
  185 {
  186     /* FUNCTION process */
  187     int i, j;
  188 
  189     for (i = 0; i < MAXTEAM; i ++)
  190         {
  191             /* for */
  192             if (0 < teamUsed[i])
  193                 {
  194                     /* team competed */
  195                     results[numCompeting].num = i;
  196                     results[numCompeting].solved = 0;
  197                     results[numCompeting].time = 0;
  198                     for (j = 0; j < MAXPROB; j ++)
  199                         {
  200                             /* calculate team results */
  201                             if (0 > contestArray[i][j])
  202                                 {
  203                                     /* negative means problem solved */
  204                                     results[numCompeting].solved++;
  205                                     results[numCompeting].time = results[numCompeting].time - contestArray[i][j];
  206                                 } /* negative means problem solved */
  207                         } /* calculate team results */
  208                     numCompeting++;
  209                 } /* team competed */
  210         } /* for */
  211     DEBUG printf("DUMP\n");
  212     DEBUG dump1();
  213     qsort(results, numCompeting, sizeof(teamStruct), compare);
  214     DEBUG printf("SORTED DUMP\n");
  215     DEBUG dump1();
  216     dump2();
  217 } /* FUNCTION process */
  218 
  219 int main ()
  220 {
  221     /* main */
  222     int i;
  223 
  224     init();
  225     for (i=0; i<numberOfTimes; i++)
  226         {
  227             /* while */
  228             if (0 != i)
  229                 {
  230                     printf("\n");
  231                 }
  232             getInput();
  233             process();
  234         } /* while */
  235 
  236     return EXIT_SUCCESS;
  237 } /* main */
  238 
  239