|
|
#include <stdio.h>
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
/*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;
|
|
|
}
|