大意:给你一些木筷子,让你去加工,如果后一个的长度,重量都比前一个的大的话,不需要调试的时间,否则调试的时间+1,求最小的调试时间。
思路:跟最小拦截系统有点相像。
解题思路:
对木棍的长度和重量进行排序,以长度为首要考虑。排序完后的不一定都是下一根木棍重量和长度都大于前一根的。于是,我们对排序后的数组进行多次扫描,将可以在一次建立时间内完成的进行标记,知道木棍全部标记(设置一个外部变量来计数已扫描的元素的数量)。
例子:
5
4 9 5 2 2 1 3 5 1 4
排序完后:
1 4 2 1 3 5 4 9 5 2
然后进行第一次扫描:使用mark[]数组进行标记,mark[]初始化为0,红色为第一次描过的。
Stiks: (1 4) (2 1) (3 5) (4 9) (5 2)
Mark: 1 0 1 1 0
这是的setuptime为建立第一根木棍所要的时间,即1,此时扫描计数为3
接着进行第二次扫描,蓝色为第二次扫描过的结果。
Stiks: (1 4) (2 1) (3 5) (4 9) (5 2)
Mark: 1 0 1 1 0
这是的setuptime为1,此时扫描计数为5。
CODE:
#include <iostream>
using namespace std;
const int SIZE = 10001;
struct node
{
int l, w;
}a[SIZE];
int flag[SIZE];
int cmp(const node &a, const node &b)
{
if(a.l < b.l) return 1;
else return 0;
return a.w < b.w;
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int n;
scanf("%d", &n);
for(int i = 0; i < n ; i++) scanf("%d%d", &a[i].l, &a[i].w);
sort(a, a+n, cmp);
int num = 0, time = 0;
memset(flag, 0, sizeof(flag));
while(num < n)
{
int cnt = 0;
for(int i = 0; i < n; i++) if(!flag[i])
{
flag[i] = 1;
time++;
num++;
cnt = i;
break;
}
for(int i = 0; i < n; i++) if(!flag[i])
{
if(a[i].l >= a[cnt].l && a[i].w >= a[cnt].w)
{
flag[i] = 1;
num++;
cnt = i;
}
}
}
printf("%d\n", time);
}
return 0;
}
using namespace std;
const int SIZE = 10001;
struct node
{
int l, w;
}a[SIZE];
int flag[SIZE];
int cmp(const node &a, const node &b)
{
if(a.l < b.l) return 1;
else return 0;
return a.w < b.w;
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int n;
scanf("%d", &n);
for(int i = 0; i < n ; i++) scanf("%d%d", &a[i].l, &a[i].w);
sort(a, a+n, cmp);
int num = 0, time = 0;
memset(flag, 0, sizeof(flag));
while(num < n)
{
int cnt = 0;
for(int i = 0; i < n; i++) if(!flag[i])
{
flag[i] = 1;
time++;
num++;
cnt = i;
break;
}
for(int i = 0; i < n; i++) if(!flag[i])
{
if(a[i].l >= a[cnt].l && a[i].w >= a[cnt].w)
{
flag[i] = 1;
num++;
cnt = i;
}
}
}
printf("%d\n", time);
}
return 0;
}