POJ 1065 Wooden Sticks 贪心

一道贪心题目,题意:有n个木棒,分别不同的长度和不同的重量,一个机器需要处理这些木棒,如果第i+1个木棒的重量和长度都>=第i个处理的木棒,那么将不会耗费时间,否则需要增加一个单位的时间,问最少需要多少时间处理完(包括机器启动的时间)

  思路:我们把木棒按重量从小到大排列,而且相同的重量按长度从小到大排列,然后每次选取合适的木棒加入一个集合,这个集合木棒的顺序是按重量和长度递增的,也就是说这个集合只需要一个单位的时间就可以处理完,我们可以证明是最优的:

因为我们已经对木棒进行了排序,那么我们每次选取的木棒是对以后放木棒影响最小的那一个,这样我们就会得到最优解。

 

  
    
#include < iostream >
#include
< cstdio >
#include
< memory.h >
#include
< algorithm >
using namespace std;

#define MAXN 10050

 

struct Node{
int x,y;
}node[MAXN];

 

bool cmp( const Node & a, const Node & b)
{
if (a.y == b.y)
return a.x < b.x;
return a.y < b.y;
}

int main()
{
int n,i,j,tt,arr[MAXN],flag,tmp,n_ans;
scanf(
" %d " , & tt);
while (tt -- )
{
scanf(
" %d " , & n);
for (i = 0 ;i < n; ++ i)
scanf(
" %d%d " , & node[i].x, & node[i].y);
memset(arr,
0 , sizeof (arr));
sort(node,node
+ n,cmp);
n_ans
= 0 ;
for (i = 0 ;i < n; ++ i)
{
flag
= 0 ;
for (j = 0 ;j <= n_ans; ++ j)
if (node[i].x >= arr[j])
{
arr[j]
= node[i].x;
flag
= 1 ;
break ;
}
if ( ! flag)
{
++ n_ans;
arr[n_ans]
= node[i].x;
}
}
printf(
" %d\n " ,n_ans + 1 );
}
return 0 ;
}

你可能感兴趣的:(poj)