POJ 1065 Wooden Sticks 贪心
一道贪心题目,题意:有n个木棒,分别不同的长度和不同的重量,一个机器需要处理这些木棒,如果第i+1个木棒的重量和长度都>=第i个处理的木棒,那么将不会耗费时间,否则需要增加一个单位的时间,问最少需要多少时间处理完(包括机器启动的时间)
思路:我们把木棒按重量从小到大排列,而且相同的重量按长度从小到大排列,然后每次选取合适的木棒加入一个集合,这个集合木棒的顺序是按重量和长度递增的,也就是说这个集合只需要一个单位的时间就可以处理完,我们可以证明是最优的:
因为我们已经对木棒进行了排序,那么我们每次选取的木棒是对以后放木棒影响最小的那一个,这样我们就会得到最优解。
#include <iostream>
#include <cstdio>
#include <memory.h>
#include <algorithm>
using namespace std;
#define MAXN 10050struct 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;
}