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 {
}
}
}