http://acm.hdu.edu.cn/showproblem.php?pid=1051
一束待处理木棍,若后面的木棍的长 L 和宽 W 均不小于前一根木棍,则处理机器的不需要启动时间,否则需要1 min (第一根木棍需要1min),问最少需要处理时间?
#pragma warning (disable:4786)
#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 5000
int re[MAX + 10];
struct stick{
int l;
int w;
}arr[MAX+10];
//按长或宽排序皆可
bool cmp( stick s1, stick s2 ){
if( s1.l != s2.l )
return s1.l < s2.l;
//长相等情况下需按宽排序
else return s1.w < s2.w;
}
int main(){
int n,i,j,t;
scanf( "%d", &t );
while( t -- ){
memset( re, 0, sizeof(re) );
scanf("%d",&n);
for( i = 0; i < n; i ++ ){
scanf( "%d",&arr[i].l );
scanf( "%d",&arr[i].w);
}
sort( arr, arr + n,cmp );
//求出宽的最长递减子序列长度:size
int size = 1;
re[0] = arr[0].w;
for( i = 1; i < n; i ++ ){
if( arr[i].w < re[size - 1] ){
re[size] = arr[i].w;
size ++;
}
else{
for( j = 0; j < size; j ++ ){
//开始写了 re[j] < arr[i].w, wa了很多次
if( re[j] <= arr[i].w ){
re[j] = arr[i].w;
break;
}
}
}
}
printf( "%d\n", size );
}
return 0;
}