poj1065(贪心)

悲催的贪心,错了一晚上,还是写的不够严谨;贪心并没想象中的那么简单,重点在悟啊,自己的误也忒多了点!

这题有点像最长上升子序列,当然二者之间有些本质之别,这题是让求最少有几个上升序列,用贪心的时候要注意先进行从大 到小排序,每次判断一个木头,是否可以加入一个前面某一个序列,可以的话标记此为该段的尾位置,把以前的尾位置置零,如果有多个符合条件的序列则选取尾值最大的一个;

#include <iostream>
#include <stdlib.h>
using namespace std;
typedef struct node
{
int x;
int y;
int flag;
}Node;
Node wood[5001];
int cmp(const void*s,const void*t)
{
if((*(Node*)s).x>(*(Node*)t).x)
return 1;
else
if((*(Node*)s).x<(*(Node*)t).x)
return -1;
else
{
if((*(Node*)s).y>(*(Node*)t).y)
return 1;
else
return -1;
}
}
int main()
{
int n;
int f;
cin>>n;
while(n--)
{
int m;
cin>>m;
int i,j;
for(i=0;i<m;i++)
{
scanf("%d%d",&wood[i].x,&wood[i].y);
wood[i].flag=0;
}
qsort(wood,m,sizeof(wood[0]),cmp);
//for(i=0;i<m;i++)
// cout<<wood[i].x<<" "<<wood[i].y<<endl;
int sum=1;
wood[0].flag=1;
for(i=1;i<m;i++)
{ f=-1;
for(j=0;j<i;j++)
if(wood[j].y<=wood[i].y&&wood[j].flag==1)
{
if(f==-1)
f=j;
else
if(wood[f].y<=wood[j].y)
f=j;
}
if(f!=-1)
{
wood[f].flag=0;
wood[i].flag=1;

}
else
{
wood[i].flag=1;
sum++;
}
}
cout<<sum;
if(n!=0)
cout<<endl;

}

return 0;
}
原文地址:https://www.cnblogs.com/orangeblog/p/2433864.html