题意:1个机器处理木板,机器重置需要1分钟,如果下1块木板的长度和质量均大于等于前1块的则机器无需重置,否则重置,1开始机器也要花费1分钟,求处理完木板的最短时间。
分析:先按木板的长度排序,若长度相同则按质量排序(从小到大),然后从前往后扫描数组,找出符合的则标记,找完1轮在回头找,直到所有木板被标记则可得最小时间。
#include<iostream>
#include<algorithm>
using namespace std;
#define N 5005
struct A
{
int w,l;
} a[N];
bool cmp(A a,A b)
{
if(a.l<b.l) return true;
else if(a.l>b.l) return false;
else if(a.w<=b.w) return true;
else return false;
}
bool isuser[N];
int main()
{
int T,n,i,count,j,k;
cin>>T;
while(T--)
{
cin>>n;
for(i=0;i<n;i++)
cin>>a[i].l>>a[i].w;
sort(a,a+n,cmp); //先按木板长排序,相等则按质量排序,从小到大
memset(isuser,false,sizeof(isuser));
count=0;
for(i=0;i<n;i++)
{
if(!isuser[i])
{
count++;
k=i;
for(j=k+1;j<n;j++)
if(!isuser[j] && a[j].l>=a[k].l && a[j].w>=a[k].w)
{
isuser[k]=true;
isuser[j]=true;
k=j;
}
if(!isuser[k]) isuser[k]=true;
}
}
cout<<count<<endl;
}
return 0;
}