hdu1065&&poj1051 Wooden Sticks

来源:互联网 发布:加里波利战役数据 编辑:程序博客网 时间:2024/05/16 09:57

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