ACSU Programming Competition
21 September 1996
Results and Solutions
Problems
The problems were available as a Microsoft Word document. However, I was
informed that the document was infected with the Word macro virus. I will
repost the problems once the virus has been removed. If you'd like to see some
sample problems, go to the
1996 ACM
International contest problems. Keep in mind that our problems will be
similar, but much easier.
Results
Four contestants correctly answered three problems. They were:
- Xun Huang, 418 minutes
- Hector Yee, 470 minutes
- Ed Wayt, 588 minutes
- Martin Handwerker, 831 minutes
Four contestants correctly answered two problems. They were:
- Nisheeth Renjan, 221 minutes
- Sandeep Tamhankar, 269 mintues
- Chris Heisterkamp, 280 minutes
- Walter Bell, 374 minutes
Solutions
There were 6 problems. Only problems 1 through 4 had correct submissions.
As a result, I am only posting the solutions to these problems.
Problem 1 -- Base -2
int base_m2(int i)
{
int n, acc, sign;
for (n = 4096, acc = 0, sign = 1; n >= 1; n /= 2, sign = - sign)
acc += sign * ((i / n) % 2) * n;
return acc;
}
void print_base_2(int i)
{
int n;
for (n = 4096; n >= 1; n /= 2)
if (((i / n) % 2) != 0) break;
for (; n >= 1; n /= 2)
printf("%d", (i / n) % 2);
}
void main(void)
{
int i, j;
do {
scanf("%d", &i);
if (i == 0) return;
printf("%5d base 10 = ", i);
for (j = 0; j < 4096; j++)
if (base_m2(j) == i)
{
print_base_2(j);
break;
}
printf(" base -2\n");
} while (1);
}
Problem 2 -- Beekeeper
int day = 0;
double honey = 20.0;
int num = 0;
double net;
typedef struct {
int day;
double grams;
} queen_type;
queen_type queen;
int drone[50000];
void main(void)
{
int i, j;
scanf("%lf", &net);
queen.day = 0;
queen.grams = 0.5;
do {
day ++;
queen.day ++;
if (queen.day < 7)
{
honey -= queen.grams;
queen.grams *= 1.5;
}
if (queen.day >= 3)
for (i = 1; i <= 5; i++)
{
num ++;
drone[num] = 0;
}
if (queen.day == 7)
{
queen.day = 1;
queen.grams = 0.5;
honey -= queen.grams;
queen.grams *= 1.5;
}
j = 1;
while (j <= num)
{
drone[j] ++;
if (drone[j] > 2)
honey += net;
if (drone[j] == 20)
{
drone[j] = drone[num];
num --;
}
else j ++;
}
} while (honey < 100000.0);
printf("It will take %d days to produce 100 kilograms of honey.\n", day);
}
Problem 3 -- The Tickler
void main(void)
{
int m[50], d[50], y[50], mm, dd, yy, i, j;
char e[50][50], ee[50];
int n = 0;
for (n = 0; (read_line(m+n, d+n, y+n, e+n) != 0); n++);
for (i = 0; (read_line(&mm, &dd, &yy, ee) != 0); i++)
{
printf("%d/%d/%d\n", mm, dd, yy);
for (j = 0; j < n; j++)
if ( ((mm == m[j]) || (m[j] == -1))
&&((dd == d[j]) || (d[j] == -1))
&&((yy == y[j]) || (y[j] == -1)) )
printf("%s\n", e[j]);
printf("\n");
}
}
int read_line(int *m, int *d, int *y, char *e)
{
int i = 0, j, ret;
char line[80];
if (gets(line) == NULL) return 0;
if (line[0] == 0) return 0;
ret = sscanf(line, "%d", m);
if (ret == 0) *m = -1;
for (j = 0; line[j] != '/'; j++);
ret = sscanf(&(line[j+1]), "%d", d);
if (ret == 0) *d = -1;
j++;
for (; line[j] != '/'; j++);
ret = sscanf(&(line[j+1]), "%d", y);
if (ret == 0) *y = -1;
for (; line[j] > ' '; j++)
if (line[j] == 0) return 1;
for (; line[j] <= ' '; j++)
if (line[j] == 0) return 1;
strcpy(e, &(line[j]));
return 1;
}
Problem 4 -- Very Long Multiplication
#define MAX_DIG 101
void in_num(int *f)
{
int in[MAX_DIG];
int j, k;
for (j = 0; (in[j] = getchar()) >= '0'; j++) in[j] -= '0';
for (k = j-1; k >= 0; k--) f[j-1-k] = in[k];
f[j] = 0;
}
void print_num(int *f)
{
int j;
for (j = MAX_DIG-1; (f[j] == 0) && (j > 0); j--);
for (; j >= 0; j--)
{
printf("%c", f[j]+'0');
if ((j % 3 == 0) && (j != 0)) printf(",");
}
printf("\n");
}
void main(void)
{
int n, i, j1, j2, k, f1[MAX_DIG], f2[MAX_DIG], f3[MAX_DIG];
scanf("%d", &n);
scanf("\n");
for (i = 0; i < n; i++)
{
for (k = 0; k < MAX_DIG; k++) f1[k] = f2[k] = f3[k] = 0;
in_num(f1);
in_num(f2);
for (j2 = 0; j2 < MAX_DIG; j2 ++)
for (j1 = 0; j1 < MAX_DIG - j2; j1++)
{
f3[j1+j2] += f1[j1] * f2[j2];
f3[j1+j2+1] += f3[j1+j2] / 10;
f3[j1+j2] %= 10;
}
print_num(f3);
}
}
Last updated 7 September 1997.