典型的贪心题目,做过很久了,今天复习贪心,回头看了看,顺便把报告补上。
我的思路是做一个标记变量flag和一个计算的变量k(k = n),flag初始为0,
每次找一个满足(l <= l' && w <= w' && !flag)的序列,并将序列元素的flag标为1,
总序列就会减少一个数所以k--,找完一个序列,结果ans++。
然后回头再找第一个falg = 0的元素,确定新的序列。如此循环。。。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int N = 5007;
struct node
{
int l;
int w;
int flag;
}num[N];
int cmp(const void * a, const void * b)
{
node * c = (node *)a;
node * d = (node *)b;
if(c->l != d->l) return c->l - d->l;
else return c->w - d->w;
}
int main()
{
int T, n, i, j;
//freopen("data.in", "r", stdin);
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
for(i = 0; i < n; i++)
{
scanf("%d%d", &num[i].l, &num[i].w);
num[i].flag = 0;
}
qsort(num, n, sizeof(num[0]), cmp);
int k = n, ans = 0;
while(k > 0)
{
for(i = 0; i < n; i++) //确定新序列的开头
if(!num[i].flag)
{
num[i].flag = 1;
k--; //总序列减少
break;
}
for(j = i+1; j < n; j++)
{
if(num[i].l <= num[j].l && num[i].w <= num[j].w && !num[j].flag)
{
num[j].flag = 1;
i = j;
k--; //满足条件,加入新序列,总序列减少
}
}
ans++; //确定完一个序列
}
printf("%d\n", ans);
}
return 0;
}