题意:需要处理一些木棍。当处理第一根棍子时,需要 1 的准备时间。若之后处理的棍子,在长度和重量都大于刚刚处理过的棍子。那么不需要准备时间。问:需要最少的时间是多少。
我们要计算的是,最小的准备时间。怎样才能使准备时间最小呢?当然是使当前处理的木棍的长度和重量都尽量的小,这样下一根木棍就有更大的可能直接处理。对了,就是贪心。我们可以排序,把木棍的长度和重量排序。这样选择的时候就保证了我们已经在为下一次选择留更大的空间。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 5000 + 5;
struct sticks
{
int length, weight;
bool operator<(const sticks& a) const// 排序的选择,优先考虑长度
{
if(length != a.length)
return length < a.length;
return weight < a.weight;
}
};
sticks ws[maxn];
bool vis[maxn];
int main()
{
int T;
scanf("%d", &T);
for(int kase = 1; kase <= T; kase++)
{
memset(vis, 0, sizeof(vis));
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%d%d", &ws[i].length, &ws[i].weight);
}
sort(ws, ws + n);
int ans = 0;
for(int i = 0; i < n; i++)
{
if(!vis[i])
{
int w = ws[i].weight;
int l = ws[i].length;
vis[i] = 1;//选了的木棍要标记
ans++;
for(int j = i + 1; j < n; j++)
{
if(!vis[j] && ws[j].length >= l && ws[j].weight >= w)
{
vis[j] = 1;
w = ws[j].weight;//更新不需要准备时间的最小要求
l = ws[j].length;
}
}
}
}
printf("%d\n", ans);
}
return 0;
}