nihonium
/
mipt_clang
Archived
1
0
Fork 0
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

80 lines
2.6 KiB
C

3 years ago
#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;
}