求最长不相交线段序列,我的思路是先按起点排序,然后动态更新序列的尾元素保证尾元素的终点值最小
#include<stdio.h>
#include<stdlib.h>
struct Exon
{
int index, begin, end;
};
static int cmp(const void *p1, const void *p2)
{
struct Exon *e1 = (struct Exon*) p1;
struct Exon *e2 = (struct Exon*) p2;
if (e1->begin != e2->begin)
return e1->begin - e2->begin;
else
return e1->end - e2->end;
}
int main()
{
int n, s[1000];
struct Exon *array = malloc(1000 * sizeof(struct Exon));
while (scanf("%d", &n), n)
{
int i, begin, end;
for (i = 0; i < n; i++)
{
scanf("%d %d", &begin, &end);
array[i].index = i + 1;
array[i].begin = begin;
array[i].end = end;
}
qsort(array, n, sizeof(struct Exon), cmp);
s[0] = array[0].index;
int total = 1, max = array[0].end;
for (i = 1; i < n; i++)
{
if (array[i].begin > max)
{
s[total++] = array[i].index;
max = array[i].end;
}
else if (array[i].end < max)
{
s[total - 1] = array[i].index;
max = array[i].end;
}
}
for (i = 0; i < total; i++)
printf(i ? " %d" : "%d", s[i]);
putchar('\n');
}
free(array);
return 0;
}