题目链接:http://acm.tju.edu.cn/toj/showp.php?pid=1469
题目大意:木块有两个属性 l w 并且木块需要一定的处理时间 若后续木块的l'>=l && w'>=w 则后续那个木块不需要处理时间。给定一组木块,问所需最少处理时间
思路:本题涉及二级结构体排序 和qsort排序函数。 先按l属性排序,若l相同,则按w属性排序。这样排好后,只要后续的w比前面的w大,则不需要处理时间。
代码:
#include <iostream>
#include <algorithm>
using namespace std;
typedef struct wood
{
int l;
int w;
}Wood;
Wood wood[5010];
int cmp(const void *a,const void *b){ //比较函数就这么写 ,在函数体里把参数类型用 *(type *)转换为需要的type即可
if((*(Wood *)a).l==(*(Wood *)b).l)
return (*(Wood *)a).w - (*(Wood *)b).w;
return (*(Wood *)a).l-(*(Wood *)b).l;
}
int main()
{
int cas,n,i,j,flag[5010];
cin>>cas;
while(cas--)
{
cin>>n;
for(i=0;i<n;i++)
{
cin>>wood[i].l>>wood[i].w;
flag[i]=0; //标记,是否需要处理时间 标为1之后表示不需要
}
qsort(wood,n,sizeof(wood[0]),cmp);//qsort对结构体二级排序 qsort参数:排序数组,数组大小,数组单个元素大小,比较函数
int min=0,pos; //min 最小处理时间
for(i=0;i<n;i++)
{
if(flag[i]==0)
{
pos=i;//pos是用来标记比到哪儿的 必须是比它前一个大 而不是比最开始那个大就行 下面那个for循环用
for(j=i+1;j<n;j++)
if(wood[j].w>=wood[pos].w&&flag[j]==0)
{
pos=j;
flag[j]=1;
}
min++;
}
}
cout<<min<<endl;
}
return 0;
}