描述
C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果第i+1个木棒的重量和长度都大于等于第i个处理的木棒,那么将不会耗费时间,否则需要消耗一个单位的时间。因为急着去约会,C小加想在最短的时间内把木棒处理完,你能告诉他应该怎样做吗?
输入
第一行是一个整数T(1
输出
处理这些木棒的最短时间。
样例输入
3
5
4 9 5 2 2 1 3 5 1 4
3
2 2 1 1 2 2
3
1 3 2 2 3 1
样例输出
2
1
3
题目思路
首先排序,然后在考虑长度的基础上遍历处理掉当前可以处理的并标记,然后继续遍历,遇见没被标记的就cnt++,再次在该点遍历一遍,注意更改当前处理的最大重量
C++
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
struct mb
{
int c,z;
};
bool cmp(mb m,mb n) //用于sort排序按木棒长度排列长度一样时按质量排列
{
if(m.c<n.c) return true;
else if(m.c==n.c&&m.z<n.z) return true;
else return false;
}
int main()
{
mb a[5010];
int b,c,d,e,f;
cin>>b;
while(b--)
{
cin>>c;
for(d=0;d<c;d++)
{
scanf("%d %d",&a[d].c,&a[d].z);
}
sort(a,a+c,cmp);
f=0;
for(d=0;d<c;d++)
{
if(a[d].z!=0) //判断这个木棒是否被标记的话
{
f++;
int m=a[d].z; //赋予临时变量
for(e=d+1;e<c;e++) //判断下一个
{
if(a[e].z>=m) //下一个大于等于的话
{
m=a[e].z; //更新临时变量
a[e].z=0; // 并且标记
}
}
}
}
cout<<f<<endl;
}
return 0;
}