题意:第一行 T 组数据,每组数据的第一行 n 代表有 n 个棍子,接下来 n 行每行两个数,代表这个棍子的长度和重量。一个机器来加工这些棍子,如果加工的第二根棍子的长和重量都不小于第一根的,那么就不需要机器的启动时间,否则需要 1 的启动时间。问加工这些棍子需要最小的启动时间。
题解:定义结构体,存储每个棍子的长和重量,还有一个 flag 变量来存储这个棍子是否被访问过。按照长从小到大排序,长度相等时按照重量从小到大排序。排好之后遍历。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
struct node{
int a, b;
bool flag;
}N[5005];
int cmp(node x, node y){
if(x.a == y.a)
return x.b < y.b;
else
return x.a < y.a;
}
int main(){
//freopen("a.txt", "r", stdin);
int T, n;
cin >> T;
while(T--){
scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%d %d", &N[i].a, &N[i].b);
N[i].flag = 0;
}
sort(N, N+n, cmp);
int ans = n;
for(int i = 0; i < n; i++){
if(N[i].flag)
continue;
int a1 = N[i].a;
int b1 = N[i].b;
for(int j = i+1; j < n; j++){
if(N[j].a >= a1 && N[j].b >= b1 && !N[j].flag){
ans--;
N[j].flag = 1;
a1 = N[j].a;
b1 = N[j].b;
}
}
}
printf("%dn", ans);
}
return 0;
}