HDOJ HDU 1051 Wooden Sticks

HDOJ HDU 1051 Wooden Sticks

题目

点此查看 HDOJ HDU 1051 Wooden Sticks

分类

贪心

题意

用机器加工 n 个木棍
每个木棍都有 长度 和 重量
每次技巧调整需要 1 单位时间 (初始时 也需要 1 单位时间 )
当 下一个 木棍 的质量的长度和质量都大于 上一个木棍时 机器不需调整
求 最少调整时间

题解

最少机器调整时间 即每次 要尽量更多的加工
我们吧 木棍 按照 质量 和 长度 排好序
每次 从第一个开始加工 记录加工过的并标记 再依此检索 并找符合不需调整规则的木棍加工
重复上述过程直到加工完成

例如
木棍 4,9 5,2 2,1 3,5 1,4
排序和加工过程

木棍第一次加工第二次加工
1,4加工-
2,1-加工
3,5加工-
4,9-加工
5,2加工-

调整时间 为 2

技巧

多重排序
我们要把木材按照先 重量 后 长度 的次序排列 (按长度排序,长度相同的按质量排序)
使用 sort 重载 < 排序时
可以这样重载
如果 长度 相同 返回长度对比的布尔值 否则 返回 质量对比的布尔值
详细可看代码

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#define inf 100000000
#define max 5010

using namespace std;

struct stick
{
    int l;
    int w;
    bool operator< (const stick & b) const
    {
        if(l != b.l)
            return l > b.l;
        return w > b.w;
    }
    //重载 < 用于 sort 排序
    friend istream & operator>>(istream & in,stick & b)
    {
        in >> b.l >> b.w;
        return in;
    }
    friend ostream & operator<<(ostream & out,stick & b)
    {
        out << b.l << " " << b.w << endl;
        return out;
    }
};

stick st[max];
int jdg[max];

int main()
{
    int n,m,ts,ll,lw;
    bool f;
    cin >> n;
    while(n--)
    {
        cin >> m;
        for(int i = 0;i < m;i++)
            cin >> st[i];
        sort(st,st+m);
        ts = 0;
        f = true;
        memset(jdg,0,sizeof(jdg));
        while(f)
        {
            ts++;
            f = false;
            ll = lw = inf;
            for(int i = 0;i < m;i++)
            {
                if(jdg[i])
                    continue;
                if(st[i].l <= ll && st[i].w <= lw)
                {
                    jdg[i] = 1;
                    f = true;
                    ll = st[i].l;
                    lw = st[i].w;
                    continue;
                }
            }
        }
        cout << ts - 1 << endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值