题目大意:
有n根木棒,我们预先知道了这些木棒的长度l和重量w,现在要将这n根木棒送入机器进行处理。
第一个木棒处理的时间为1min
当前木棒的长度为l,重量为w,当前木棒右边的木棒长度为l',重量为w'。
如果l'>=l,w'>=w,这处理右边这根木棒时,不要花费时间,否则花费1min时间。
贪心题,可以先将木棒进行排序,先按照长度进行升序排序,如果长度相同就按照重量升序排序,现在可以开一个vis数组来记录该木棒是否被访问过,
枚举初始且没用过的木棒,和该木棒后面的木棒进行比较,
如果后面的木棒l'>=l,w'>=w,就将该木棒标记为访问,并将该木棒记为当前的木棒。
继续比较,直到n,然后cnt++,继续枚举起点。
有n根木棒,我们预先知道了这些木棒的长度l和重量w,现在要将这n根木棒送入机器进行处理。
第一个木棒处理的时间为1min
当前木棒的长度为l,重量为w,当前木棒右边的木棒长度为l',重量为w'。
如果l'>=l,w'>=w,这处理右边这根木棒时,不要花费时间,否则花费1min时间。
请输出最少需要花多少的时间。
贪心题,可以先将木棒进行排序,先按照长度进行升序排序,如果长度相同就按照重量升序排序,现在可以开一个vis数组来记录该木棒是否被访问过,
枚举初始且没用过的木棒,和该木棒后面的木棒进行比较,
如果后面的木棒l'>=l,w'>=w,就将该木棒标记为访问,并将该木棒记为当前的木棒。
继续比较,直到n,然后cnt++,继续枚举起点。
每次都取最大的升序集合,那么总的集合个数肯定是最小的。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 5010;
struct Node {
int l,w;
}s[N];
int vis[N];
bool cmp(Node a,Node b) {
if(a.l != b.l) {
return a.l < b.l;
}else {
return a.w < b.w;
}
}
int main() {
int t,n;
scanf("%d",&t);
while(t--) {
scanf("%d",&n);
for(int i = 0; i < n; i++) {
scanf("%d%d",&s[i].l,&s[i].w);
}
sort(s,s+n,cmp);
memset(vis,0,sizeof(vis));
int cnt = 0;
for(int i = 0; i < n; i++) {
if(vis[i]) {
continue;
}
int cur = i;
vis[cur] = true;
for(int j = 0; j < n; j++) {
if(vis[j]) {
continue;
}
if(s[cur].l <= s[j].l && s[cur].w <= s[j].w) {
vis[j] = true;
cur = j;
}
}
cnt++;
}
printf("%d\n",cnt);
}
return 0;
}
本文介绍了一道关于木棒排序与贪心算法的题目,通过合理的排序和标记访问来寻找最优解,最终实现最小化处理木棒所需的总时间。
1192

被折叠的 条评论
为什么被折叠?



