hdu1065&&poj1051 Wooden Sticks

18 篇文章 0 订阅

hdu1065&&poj1051  Wooden Sticks   题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1051&&http://poj.org/problem?id=1065

题目大意:一堆有长度和重量的Sticks(木棒),要将它们按一定规律加工,求加工时间。

题意理解:每个单位(Sticks)有两个参数,length(长度)和weight(重量),记为l和w。加工一根木棒需一单位时间,再从剩下的木棒中选一根加工,若该木棒的l和w两参数都大于等于前一根,则不用多耗时间,否则再耗1单位时间。

题目归类:贪心水题。


代码如下:

#include<stdio.h>
#include<algorithm>
using namespace std;
struct node                //用结构体描述木棒,每根木棒有三个参数:l,w和用作标记的flag
{
	int l,w,flag;
}sticks[5050];
int cmp(node a,node b)
{
	if(a.flag==b.flag)return a.l<b.l?1:0;
	else return a.flag<b.flag?1:0;
}
int chuli(int f,int n)         //按排好的顺序遍历sticks结构体,由于长度已排,所以只判断重量,符合的标记flag,if(不符)跳过。
{
	if(sticks[0].flag)return f;
	f++;              //f代表走到第几遍(需要多少单位时间)
	sticks[0].flag=f;
	int temp=sticks[0].w;
	for(int i=1;i<n;i++)
	{
		if(temp<=sticks[i].w)sticks[i].flag=f,temp=sticks[i].w;
	}
	sort(sticks,sticks+n,cmp);   //标记一遍后,按标记排序
	return chuli(f,n);
}
int main()
{
	int t,n;
	scanf("%d",&t);
	for(int i=0;i<t;i++)
	{
		scanf("%d",&n);
		for(int j=0;j<n;j++)                             //输入
		{
			scanf("%d%d",&sticks[j].l,&sticks[j].w);
			sticks[j].flag=0;
		}
		sort(sticks,sticks+n,cmp);                       //按木棒length(长度)排序
		/*for(int i=0;i<n;i++)
		{
			printf("%d  %d  %d\n",sticks[i].l,sticks[i].w,sticks[i].flag);
		}*/
		printf("%d\n",chuli(0,n));
	}
	return 0;
}

PS:做完之后又有新思路。这题还能用结构体二重排序。定义结构体时省去flag,将sticks结构体按l和w(l优先)的顺序排序,遍历时遇到w断点时计数,可得最终时间。这个方法似乎能更省一点时间精力。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值