说实话本题没啥思路,本来以为是DP,后来网上搜了搜发现贪心就可以。。先按长在前宽在后的优先级排序,然后O(n^2)遍历可得分组的个数,具体看代码吧。。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct Stick
{
int l, w;
};
static int cmp(const void *p1, const void *p2)
{
struct Stick *s1 = (struct Stick*) p1;
struct Stick *s2 = (struct Stick*) p2;
if (s1->l != s2->l)
return s1->l - s2->l;
else
return s1->w - s2->w;
}
int main()
{
int t, n, flag[5000];
scanf("%d", &t);
struct Stick *array = malloc(5000 * sizeof(struct Stick));
while (t--)
{
scanf("%d", &n);
int i, j;
for (i = 0; i < n; i++)
scanf("%d %d", &(array[i].l), &(array[i].w));
qsort(array, n, sizeof(struct Stick), cmp);
memset(flag, 0, sizeof(flag));
int group = 0, wid;
for (i = 0; i < n; i++)
{
if (!flag[i])
{
group++;
flag[i] = 1;
wid = array[i].w;
for (j = i + 1; j < n; j++)
if (!flag[j] && array[j].w >= wid)
{
flag[j] = 1;
wid = array[j].w;
}
}
}
printf("%d\n", group);
}
free(array);
return 0;
}