Peng Lv

毋意,毋必,毋固,毋我。 言必行,行必果。

导航

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;
}

posted on 2010-03-10 13:24  Lvpengms  阅读(1200)  评论(0编辑  收藏  举报