题目大意:
有一堆木棍要放到机器里面处理,第一根放进去的木棍需要1分钟的调整机器的时间,如果后续放进的木根的长度比它长且重量比它重,则不需要重新调整机器,否则要花1分钟时间来再次调整。给出这一堆木根的各自的长度和重量,求需要的最少的时间。
解题思路:
考虑可以将木根排序,以长为第一要素,长度相同时参考重量,贪心算法,按升序排列。由于要标记木根是否已经被处理过,所以在存储木根信息的结构以中再加入一个标志位flag,初始化为0。每次从前往后找没处理过的木棍。值得注意的是,每次选定了一个木棍初始化了之后,再判断接下的k根木棍是不是能直接加工是比较的是前一个加工完的木棍,而不是本次选来初始化机器的木棍的长度和重量,具体见代码中注释了“important"的那句,也就是用cur记录每次比较对象的下标。
代码如下:
# include <iostream>
# include <algorithm>
using namespace std;
struct node
{
int l;
int w;
int flag;
}stick[50003];
int cmp(struct node a,struct node b)
{
if(a.l!=b.l)
return a.l<b.l;
else
return a.w<b.w;
}
int main()
{
freopen("input.txt","r",stdin);
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int i,j;
memset(stick,0,sizeof(stick));
for(i=0;i<n;i++)
{
scanf("%d %d",&stick[i].l,&stick[i].w);
}
sort(stick,stick+n,cmp);
int count=0;
int cur;
for(i=0;i<n;i++)
{
if(stick[i].flag==0)
{
count++;
cur=i;
for(j=i+1;j<n;j++)
{
if(stick[j].flag==0 && stick[j].w>=stick[cur].w)
{
stick[j].flag=1;
cur=j;//important
}
}
}
}
printf("%d\n",count);
}
return 0;
}