/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