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;
}