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断点时计数,可得最终时间。这个方法似乎能更省一点时间精力。