#include #include /*O(n*log(n) + n), сортировка плюс проход по массиву заявок */ /* Структура для хранения зявки */ typedef struct application { int begin; int end; } app; int vector_compare(const void *a, const void *b); app* solve(app* vector, unsigned int* NUM); int main() { /* Число заявок */ unsigned int N; scanf("%d", &N); app* vector = (app*)calloc(N, sizeof(app)); /* Считываем информацию о заявках, начало-конец */ for (unsigned int i = 0; i < N; i++) { scanf("%d %d", &vector[i].begin, &vector[i].end); } /* Сортируем заявки по времени окончания */ qsort(vector, N, sizeof(app), vector_compare); /* Указатель на vector заменится, N изменится */ vector = solve(vector, &N); printf("Решение:\nКоличество выполненных заявок:%d\n", N); for (unsigned int i = 0; i < N; i++) { printf("%i %i\n", vector[i].begin, vector[i].end); } free(vector); } int vector_compare(const void *a, const void *b) { return ((const app *)a)->end - ((const app *)b)->end; } /* Учитываем, что время не может быть отрицательным, тем самым избавляясь от надобности создавать три указателя или же прибегать к сложной сортировке */ app *solve(app *vector, unsigned int *N) { /* Сохраняем начальное значение N */ unsigned int N_init = *N; /* Конец очередной заявки */ int end = vector[0].end; for (unsigned int i = 1; i < N_init; i++) { if (end > vector[i].begin) { /* Удаляем заявки, время начала которых раньше времени конца */ vector[i].begin = vector[i].end = -1; /* Изменяем количество заявок */ (*N)--; } else { /* Иначе, обновляем значение очередного конца */ end = vector[i].end; } } app* vector_res = (app*)calloc(*N, sizeof(app)); unsigned int j = 0; /* Два случая: нужные заявки в конце, нужные заявки в начале */ for (unsigned int i = 0; i < N_init && j != *N; i++) { /* Если заявка не помечена недействительной, то вписываем ее в новый массив */ if (vector[i].begin != -1) { vector_res[j] = vector[i]; j++; } } free(vector); return vector_res; }