hdu1051 Wooden Sticks 贪心算法.

 

题目大意:

给n根木棍的长度和重量。根据要求求出制作木棍的最短时间。建立第一个木棍需要1分钟,若是接着要制作的木棍重量和长度都比此木棍长就不需要建立的时间,若是没有,则再需要建立时间。求时间最小为多少。

解题思路:

对木棍的长度和重量进行排序,以长度为首要考虑。排序完后的不一定都是下一根木棍重量和长度都大于前一根的。于是,我们对排序后的数组进行多次扫描,将可以在一次建立时间内完成的进行标记,知道木棍全部标记(设置一个外部变量来计数已扫描的元素的数量)。

例子:

5

4 9 5 2 2 1 3 5 1 4

排序完后:

1 4 2 1 3 5 4 9 5 2

然后进行第一次扫描:使用mark[]数组进行标记,mark[]初始化为0,红色为第一次描过的。

Stiks: (1 4) (2 1) (3 5) (4 9)(5 2)

Mark: 1 0 110

这是的setuptime为建立第一根木棍所要的时间,即1,此时扫描计数为3

接着进行第二次扫描,蓝色为第二次扫描过的结果。

Stiks: (1 4) (2 1) (3 5) (4 9) (5 2)

Mark: 1 0 110

这是的setuptime为1,此时扫描计数为5

#include<stdio.h>

#include<algorithm>

using namespace std;

struct sticks

{

    int length;

    int weight;

}stick[50010];

int t,n;

bool mark[5010];

bool cmp1(sticks a,sticks b)

{
    return a.length<b.length||(a.length==b.length&&a.weight<b.weight);
}

 

int main()

{

    int i;

    scanf("%d",&t);

    while(t--)

    {

        int time=0,cnt=0;

        memset(mark,false,sizeof(mark));

        scanf("%d",&n);

        for(i=0;i<n;i++)

            scanf("%d%d",&stick[i].length,&stick[i].weight);

        sort(stick,stick+n,cmp1);

        int pl;  

        while(cnt!=n)

        {

            for(i=0;i<n;i++)

                if(!mark[i])

                {pl=i;time++;break;}

            for(i=0;i<n;i++)

            {

                if(!mark[i]&&stick[i].length>=stick[pl].length&&stick[i].weight>=stick[pl].weight)

                {

                    mark[i]=true;

                    cnt++;

                    pl=i;

                }

            }

        }    
        printf("%d\n",time);
    }

	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值