题意: 如果一个布娃娃a的h和w都大于另一个布娃娃b的h和w, 那么b就能嵌套在a里面, 要求所有娃娃嵌套后的最小个数.
先对娃娃的w按从大到小排序, 如果w相等, 则按h从小到大排序, 求出lis.
#include <stdio.h>
#include <algorithm>
using namespace std;
#define MAX 500005
#define INF 0xffffff
struct doll {
int w, h;
};
int num[MAX];
int d[MAX];
doll dolls[MAX];
int binSearch(int* arr, int left, int right, int key) {
int mid;
while (left < right) {
mid = (left + right)>>1;
if (arr[mid] <= key) {
left = mid + 1;
} else {
right = mid;
}
}
return left;
}
int lis(int* arr, int n) {
int i, k;
for (i = 0; i < n; i++) {
d[i] = INF;
}
for (i = 0; i < n; i++) {
k = binSearch(d, 0, n - 1, arr[i]);
d[k] = arr[i];
}
for (i = 0; i < n; i++) {
if (d[i] == INF) {
return i;
}
}
return i;
}
bool cmp(doll &a, doll &b) {
if(a.w > b.w) {
return true;
}
if(a.w == b.w && a.h < b.h) {
return true;
}
return false ;
}
int main() {
int T;
int n, i;
while (scanf("%d", &T) != EOF) {
while (T--) {
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d%d", &dolls[i].w, &dolls[i].h);
}
sort(dolls, dolls + n, cmp);
for (i = 0; i < n; i++) {
num[i] = dolls[i].h;
}
printf("%d\n", lis(num, n));
}
}
return 0;
}