<pre class="cpp" name="code">#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int M =5100;
struct Node{
int L;
int W;
bool operator <(const Node t)const
{
if(L==t.L)
return W>t.W;
return L>t.L;
}
}node[M];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>node[i].L>>node[i].W;
}
sort(node+1,node+n+1); //按长度大到小 排好后 关于W的LIS变形 类型 hdu 1275拦截导弹
int ans,num,p[M];//当前最大的保存W的值即可 p[i] 是递减的
num=1;
p[num]=node[num].W;
for(int i=2;i<=n;i++)
{
int flag=0;
for(int j=1;j<=num;j++) // 贪心 : 对于 a,b a<b 并且 x<a,&&x<b x应该在a之后
{ // 反证 当x跟在b之后 若存在 y>x&&y>a&&y<b 因为y>x&&y>a 则需要setup num数量增加
//说明 x在a之后 Min可能会减小
// 若存在 y>x&&y<a&&y<b 也不会丢失最优解
if(p[j]>=node[i].W)
{
p[j]=node[i].W;
flag=1;
break;
}
}
if(!flag) // 重新开一个
{
num++;
p[num]=node[i].W;
}
}
cout<<num<<endl;
}
return 0;
}
poj 1065 Wooden Sticks贪心水过
最新推荐文章于 2018-03-07 17:51:00 发布