题目链接
http://bailian.openjudge.cn/practice/1065/
思路:贪心法。对所有wood按照len升序、weight升序排序。对于每一个wood,向后查找,尽可能找到能覆盖它的wood,并将覆盖它的wood标进行加工(不需要额外的setup time)。遍历时,如果当前wood未加工,setup time 加1
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int T, N;
int used[6000];
struct wood
{
int len;
int weight;
}w[6000];
bool cmp(wood a, wood b)
{
return (a.len<b.len || (a.len==b.len&&a.weight<b.weight));
}
int main()
{
scanf("%d", &T);
while(T--)
{
int setup = 0;
scanf("%d", &N);
for(int i=0;i<N;i++)
{
scanf("%d%d", &w[i].len, &w[i].weight);
used[i] = 0;
}
sort(w, w+N, cmp); // x升序排列,x相同时,按照y升序排列
for(int i=0;i<N;i++)
{
if(used[i] == 0)
{
setup++;
// 从后面找能覆盖的,贪心法
int len = w[i].len, weight = w[i].weight;
for(int j=i+1;j<N;j++)
{
if(used[j]==0 && w[j].len>=len && w[j].weight>=weight)
{
used[j] = 1;
len = w[j].len;
weight = w[j].weight;
}
}
}
}
printf("%d\n", setup);
}
return 0;
}