题意:把树拿去加工,当下一个要加工的树的l,w都不比前一个小的时候,不花费设置时间。问加工这些树,总共要多少设置时间。
我猜的方法是把l排序,找w的不减序列有几个。但是把n==5000看成了50000,鄙视自己吧。到discuss看了之后,发现这种贪心是可以证明的:http://poj.org/showmessage?message_id=156611 好吧,我学的东西太少了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <string>
#define LL long long
#define DB double
#define SF scanf
#define PF printf
#define N 5009
#define bug cout<<"bug"<<endl;
using namespace std;
struct nod{
int l,w;
void get(){SF("%d%d",&l,&w);}
bool operator<(const nod t)const
{
return l<t.l||(l==t.l&&w<t.w);
}
} re[N];
int v[N];
int n;
int solve()
{
memset(v,0,sizeof(v));
int ret=0;
for(int i=0;i<n;i++)
if(v[i]==0)
{
v[i] = 1;
ret++;
int k = re[i].w;
for(int j=i+1;j<n;j++)
if(v[j]==0)
{
if(re[j].w>=k)
{
k = re[j].w;
v[j] = 1;
}
}
}
return ret;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int cas;
SF("%d",&cas);
while(cas--)
{
SF("%d",&n);
for(int i=0;i<n;i++) re[i].get();
sort(re,re+n);
PF("%d\n",solve());
}
return 0;
}