题目链接:

​http://acm.hdu.edu.cn/showproblem.php?pid=1051​


题目大意:

有N根木棍,每根木棍的长度和质量是已知的,机器要处理这N根木棍,处理时间和木棍的长度和

权重有关。第一根木棍的处理时间为1min,之后处理的木棍如果长度大于等于前一根木棍的长度

并且权重也大于等于前一根木棍的长度,就不需要处理时间;否则就需要1min的处理时间。问:

最小的处理时间为多少。


思路:

贪心思想。先将木棍按长度从小到大排列,如果长度一致,则按权重从小到大排列。然后根据题目

要求,如果后边的木棍长度和权重都大于前者,则不需要处理时间,否则加1min处理时间。


AC代码:


#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 5050;

struct Node
{
int l, w;
int flag;
}node[MAXN];

int cmp(Node a, Node b)
{
if(a.l != b.l)
return a.l < b.l;
return a.w < b.w;
}

int main()
{
int N,T;
cin >> T;
while(T--)
{
cin >> N;
memset(node,0,sizeof(node));
for(int i = 0; i < N; ++i)
{
cin >> node[i].l;
cin >> node[i].w;
}
sort(node,node+N,cmp);
int Sum = 0;
for(int i = 0; i < N; ++i)
{
if(node[i].flag == 1)
continue;
Sum++;
int k = i;
for(int j = i+1; j < N; ++j)
{
if(node[j].l >= node[k].l && node[j].w >= node[k].w && node[j].flag == 0)
{
node[j].flag = 1;
k = j;
}
}
}
printf("%d\n",Sum);
}

return 0;
}