/*题意是有n根木头,第一根木头加工处理要1分钟,当比第一根木头长度长重量大是加工处理不需要加时间,求最少的加工时间
1.定义一个wood的结构体,包括长度,重量和是否加工过。
2.定义数组的排序规则cmp按照从小到大的长度排当长度相同时,重量小的排在前面。
3.从长度最小的木头开始加工计数sum加一,并且把后面所有比这根木头长且重量大的木头都遍历了
4.最后的sum就是答案
*/
代码如下:
#include<iostream>
using namespace std;
#include<algorithm>
using namespace std;
#include<algorithm>
struct wood{//定义每根木棍的长度重量和是否遍历
int length;
int weight;
int vis;
};
wood a[5005];
int cmp(wood a,wood b)//按木棍的长度的从小到大排序,当长度一致是把总重量偏小的排在前面
{
if(a.length==b.length)
return a.weight<b.weight;
else
return a.length<b.length;
}
int main()
{
int n,t,sum;
cin>>t;
while(t--)
{
cin>>n;sum=0;
for(int i=0;i<n;i++)
{
cin>>a[i].length>>a[i].weight;
a[i].vis=0;
}
sort(a,a+n,cmp);
for(int i=0;i<n;i++)
{
int length;
int weight;
int vis;
};
wood a[5005];
int cmp(wood a,wood b)//按木棍的长度的从小到大排序,当长度一致是把总重量偏小的排在前面
{
if(a.length==b.length)
return a.weight<b.weight;
else
return a.length<b.length;
}
int main()
{
int n,t,sum;
cin>>t;
while(t--)
{
cin>>n;sum=0;
for(int i=0;i<n;i++)
{
cin>>a[i].length>>a[i].weight;
a[i].vis=0;
}
sort(a,a+n,cmp);
for(int i=0;i<n;i++)
{
if(a[i].vis==0)//没有被处理过
{//因为符合条件的木棍不会加时间,只需标记处理过就好
for(int j=i+1;j<n;j++)//找出第i根木棍的后面那些长度比它大的基础上重量也比它大的木棍,并且没有被处理过的
{
if(a[j].vis==0&&a[i].weight<=a[j].weight)
{
a[j].vis=-1;//因为符合条件的木棍不会加时间,只需标记处理过就好
a[i].weight=a[j].weight;//处理过更大的重量的木棍,要用更大的木棍来和小一个木棍来作比较
}
}
sum++;
}
{//因为符合条件的木棍不会加时间,只需标记处理过就好
for(int j=i+1;j<n;j++)//找出第i根木棍的后面那些长度比它大的基础上重量也比它大的木棍,并且没有被处理过的
{
if(a[j].vis==0&&a[i].weight<=a[j].weight)
{
a[j].vis=-1;//因为符合条件的木棍不会加时间,只需标记处理过就好
a[i].weight=a[j].weight;//处理过更大的重量的木棍,要用更大的木棍来和小一个木棍来作比较
}
}
sum++;
}
}
cout<<sum<<endl;
}
cout<<sum<<endl;
}
}