poj1065 Wooden Sticks

链接:http://poj.org/problem?id=1065

第一根木材被处理时,时间必定为1minute。此后被处理的木材如果长度和重量都大于前一根木材则无需消耗时间,否则要消耗时间1minute。

采取贪心策略,对木材的长度进行排序(当然也可以对其重量进行排序),关键一点,当长度相等时,则应该再对重量进行排序。

#include<iostream>
#include<algorithm>
#include<cstring>
#define MAXN 5005
using namespace std;

struct Stick  //Stick结构体,存储木棒的长度和重量
{
  int l,w;
};
Stick st[MAXN];
bool vist[MAXN]; //若木棒已被处理,则木棒被访问
int cmp(Stick a,Stick b)
{
	if(a.l==b.l)
		return a.w-b.w<0;//当木棒长度相等时,再比较它的重量
	else 
        return a.l-b.l<0;//若木棒长度不等,则直接比较其长度
}

int main()
{
	int t,n,num,times;//times记录消耗时间
	int rel,rew;      //用于记录前一根木棒的长度和重量
	int i,j,k;
	cin>>t;
	for(i=0;i<t;i++)
	{
	   cin>>n;
	   for(j=0;j<n;j++)
		cin>>st[j].l>>st[j].w;
	   sort(st,st+n,cmp);
	   memset(vist,false,sizeof(vist));
	   times=0;
	   num=n-1;         //因为第一根被默认处理,所以num等于n-1
	   rel=st[0].l;     //第一根木棒为前一根木棒
	   rew=st[0].w;
	   vist[0]=true;   //这个条件加不加无所谓
	   while(num)
	   {
	      for(j=1;j<n;j++)                           //for循环依次寻找满足条件的木棒
			if(st[j].l>=rel&&st[j].w>=rew&&!vist[j])//如果木棒长度重量长度都大于前一根木棒且未被处理
				                                    //符合条件,木棒被处理
			{
			  vist[j]=true;   //木棒被访问
			  num--;          //木棒总数减一
			  rel=st[j].l;    //当前木棒变成前一根木棒
			  rew=st[j].w;
			}
           times++;         //无满足条件的木棒时,跳出,时间+1
		   int flag=false;
          for(k=1;k<n;k++)
		  {
			if(!vist[k])
			{
			   rel=st[k].l;
			   rew=st[k].w;
			   flag=true;    //还有没被访问的木棒,则要继续处理
			                //且第一根被选出的没有访问的木棒要作为前一根木棒被处理
			}
			if(flag)break;
		  }
	   }
	   cout<<times<<endl;
	}
	return 0;
}
	


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值