http://acm.pku.edu.cn/JudgeOnline/problem?id=1209
Код:
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { int month, date, imp; char event[512]; int id; } aniv_t; aniv_t a[1024]; int na = 0; int year, date, month; int first = 1; void reg(int _date, int _month, int imp, char *event) { char *p; p = event; while (*p == ' ') { p++; } a[na].month = _month; a[na].date = _date; a[na].imp = imp; strcpy(a[na].event, p); a[na].id = na; na++; } int diff(int date1, int month1, int date2, int month2) { int d = 0; int y = year; int mdates[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; if (month1 == month2 && date1 > date2) { d += mdates[month1-1] + (y % 4 == 0 && month1 == 2 ? 1 : 0); month1++; if (month1 > 12) { month1 = 1; y++; } } while (month1 != month2) { d += mdates[month1-1] + (y % 4 == 0 && month1 == 2 ? 1 : 0); month1++; if (month1 > 12) { month1 = 1; y++; } } d += date2 - date1; return d; } int cmp(const void *_a, const void *_b) { int ya = year, yb = year; int da, db; aniv_t *a = (aniv_t *)_a, *b = (aniv_t *)_b; da = diff(date, month, a->date, a->month); db = diff(date, month, b->date, b->month); if (a->month < month || (a->month == month && a->date < date)) { ya++; } if (b->month < month || (b->month == month && b->date < date)) { yb++; } if (a->date == date && a->month == month && b->date == date && b->month == month) { if (a->id < b->id) { return -1; } if (a->id > b->id) { return 1; } } if (a->date == date && a->month == month) { return -1; } if (b->date == date && b->month == month) { return 1; } if (a->imp - (da - 1) > b->imp - (db - 1)) { return -1; } if (a->imp - (da - 1) < b->imp - (db - 1)) { return 1; } if (ya < yb) { return -1; } if (ya > yb) { return 1; } if (a->month < b->month) { return -1; } if (a->month > b->month) { return 1; } if (a->date < b->date) { return -1; } if (a->date > b->date) { return 1; } if (a->id < b->id) { return -1; } if (a->id > b->id) { return 1; } return 0; } int main() { int imp; char temp[256]; char *p; int i, j; int d; year = atoi(gets(temp)); while (1) { gets(temp); if (strcmp(temp, "#") == 0) break; p = strtok(temp, " "); if (*p == 'A') { date = atoi(strtok(NULL, " ")); month = atoi(strtok(NULL, " ")); imp = atoi(strtok(NULL, " ")); p = strtok(NULL, ""); reg(date, month, imp, p); } else if (*p == 'D') { if (first) { first = 0; } else { printf("\n"); } date = atoi(strtok(NULL, " ")); month = atoi(strtok(NULL, " ")); qsort(a, na, sizeof(aniv_t), cmp); printf("Today is: %2d %2d\n", date, month); for (i = 0; i < na; i++) { d = diff(date, month, a[i].date, a[i].month); if (a[i].imp - (d - 1) > 0) { printf("%3d%3d ", a[i].date, a[i].month); if (d == 0) { printf("*TODAY* "); } else { for (j = 0; j < a[i].imp - (d - 1); j++) { printf("*"); } for (; j < 7; j++) { printf(" "); } printf(" "); } printf("%s\n", a[i].event); } } } else { } } }