木棒问题

问题 H: 木棒

时间限制: 1 Sec  内存限制: 32 MB
提交: 36  解决: 9
[提交][状态][讨论版]

题目描述

现有n根木棒,已知它们的长度和重量。要用一部木工机一根一根地加工这些木棒。该机器在加工过程中需要一定的准备时间,是用于清洗机器,调整工具和模板的。木工机需要的准备时间如下:
(1)第一根木棒需要1min的准备时间;
(2)在加工了一根长为l,重为w的木棒之后,接着加工一根长为ll(l<=ll),重为ww(w<=ww)的木棒是不需要任何准备时间的。否则需要一分钟的准备时间。
给定n根木棒,你要找到最少的准备时间。例如现在有长和重分别为(4,9),(5,2),(2,1),(3,5)和(1,4)的五根木棒,那么所需准备时间最少为2min,顺序为(1,4),(3,5),(4,9),(2,1),(5,2)。

输入

输入包含多组测试数据。输入的第一行是一个整数T,表示测试数据的个数。
每个测试例两行:
第一行是一个整数n(1<=n<=5000),表示有多少根木棒;
第二行包括n*2个整数,表示了l1,w1,l2,w2,l3,w3,...,ln,wn,这些数均不大于10000,其中li和wi表示第i根木棒的长度和重量。

输出

输出以分钟为单位的最少准备时间。

样例输入

3

5

4 9 5 2 2 1 3 5 1 4

3

2 2 1 1 2 2

3

1 3 2 2 3 1

样例输出

2

1

3

题意概括:

在制作一根木棍需一分钟的准备时间,如果有一根木棍的长度和重量同时都大于等于正在制作的木根时则不需要准备时间。

解题分析:

首先按木棍的长度排序,如果在做a木棍时有多根木棍的长度好和重量都符合不需要准备的条件,那么a木棍只可以使一根木棍不需要准备时间,然后用那根符合条件的木棍再去与后面的比较,同时用过的木棍不可以再次用。

测试样例:

5

3

1 2 3 3 1 2

1

1 1

2

1 1 1 1

4

5 6 9 8 9 9 8 8

3

6 5 9 8 2 0

测试样例输出:

1

1

1

1

1

代码:

#include<stdio.h>
#include<algorithm>

using namespace std;

struct STU{
    int w,l,k;
}stu[5005];

int cmp(STU a, STU b)
{
    if(a.l == b.l)
        return a.w < b.w;
    return a.l < b.l;
}

int main()
{
    int n, i, T, j, h;
    STU a;
    while(scanf("%d", &T) != EOF){
        while(T--){
            scanf("%d", &n);
            h = n;
            for(i = 0; i < n; i++){
                scanf("%d%d", &stu[i].l, &stu[i].w);
                stu[i].k = 1;
            }
            sort(stu, stu+n, cmp);
            for(i = 0; i < n-1; i++){
                if(!stu[i].k)
                    continue;
                stu[i].k = 0;
                a.l = stu[i].l;
                a.w = stu[i].w;
                a.k = stu[i].k;
                for(j = i+1; j < n; j++){
                    if(stu[j].k && stu[j].l >= a.l && stu[j].w >= a.w){
                        stu[j]. k = 0;
                        a.l = stu[j].l;
                        a.w = stu[j].w;
                        a.k = stu[j].k;
                        h--;
                    }
                }
            }
            printf("%d\n", h);
        }
    }
    return 0;
}
时间: 2024-11-05 22:00:22

木棒问题的相关文章

luogu P3799 妖梦拼木棒

二次联通门 : luogu P3799 妖梦拼木棒 /* luogu P3799 妖梦拼木棒 用一个桶存下所有的木棒 美剧两根短的木棒长度 后随便乘一乘就 好了.. */ #include <algorithm> #include <cstdio> #define Mod 1000000007 #define Max 5000 void read (int &now) { now = 0; register char word = getchar (); while (wo

妖梦斩木棒

题目背景 妖梦是住在白玉楼的半人半灵,拥有使用剑术程度的能力. 题目描述 有一天,妖梦正在练习剑术.地面上摆放了一支非常长的木棒,妖梦把它们切成了等长的n段.现在这个木棒可以看做由三种小段构成,中间的n-2段都是左右都被切断的断头,我们记做'X',最左边的一段和最右边的一段各有一个圆头,记做'('和')'.幽幽子吃饱后闲来无事,决定戏弄一下妖梦.她拿来了许多这样的三种小段木棒,来替换掉妖梦切下来的n段中的一部分,然后问妖梦一些问题.这些操作可以这样描述: 1 x C 将第x个小段的木棒替换成C型

木棒与三角形问题小结

木棒与三角形问题,一般都能够枚举最长边,用容斥来做 题型1: 求长度为l的木棒,截成3段,求能组成三角形的方法数(截的位置不同算不同的方法比方1 3 3和3 3 1算不同的方法). //方法一: LL gao(int l){ LL ret=0; for(int i=1;2*i<l;++i) { ret+=(l-1)/2-(l/2-i); } return ret; } //方法二: //枚举最长边,用容斥来做 LL cal(LL a, LL remain) { if(a < remain) r

POJ1011 木棒(dfs+剪枝)

问题重述: Description乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位.然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度.请你设计一个程序,帮助乔治计算木棒的可能最小长度.每一节木棍的长度都用大于零的整数表示. Input输入包含多组数据,每组数据包括两行.第一行是一个不超过64的整数,表示砍断之后共有多少节木棍.第二行是截断以后,所得到的各节木棍的长度.在最后一组数据之后,是一个零. Output为每组数据,分

洛谷 P2383 狗哥玩木棒

题目背景 狗哥又趁着语文课干些无聊的事了... 题目描述 现给出一些木棒长度,那么狗哥能否用给出的木棒(木棒全用完)组成一个正方形呢? 输入输出格式 输入格式: 输入文件中的第一行是一个整数n表示测试的组数,接下来n行表示每组的测试数据. 每行的第一个数为m(4<=m<=20),接下来m个数ai(1<=ai<=1000)表示木棒的长度. 输出格式: 对于每组测试数据,如果可以组成正方形输出“yes”,否则输出“no”. 输入输出样例 输入样例#1: 3 4 1 1 1 1 5 10

P2383 狗哥玩木棒

题目背景 狗哥又趁着语文课干些无聊的事了... 题目描述 现给出一些木棒长度,那么狗哥能否用给出的木棒(木棒全用完)组成一个正方形呢? 输入输出格式 输入格式: 输入文件中的第一行是一个整数n表示测试的组数,接下来n行表示每组的测试数据. 每行的第一个数为m(4<=m<=20),接下来m个数ai(1<=ai<=1000)表示木棒的长度. 输出格式: 对于每组测试数据,如果可以组成正方形输出"yes",否则输出"no". 输入输出样例 输入样例

洛谷 P3797 妖梦斩木棒

妖梦是住在白玉楼的半人半灵,拥有使用剑术程度的能力. 题目描述 有一天,妖梦正在练习剑术.地面上摆放了一支非常长的木棒,妖梦把它们切成了等长的n段.现在这个木棒可以看做由三种小段构成,中间的n-2段都是左右都被切断的断头,我们记做’X’,最左边的一段和最右边的一段各有一个圆头,记做’(‘和’)’.幽幽子吃饱后闲来无事,决定戏弄一下妖梦.她拿来了许多这样的三种小段木棒,来替换掉妖梦切下来的n段中的一部分,然后问妖梦一些问题.这些操作可以这样描述: 1 x C 将第x个小段的木棒替换成C型,C只会是

(hdu step 4.3.5)Sticks(将n根木棒合成若干根等长的木棒,求合成后的木棒的长度的最小值)

题目: Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 364 Accepted Submission(s): 116   Problem Description George took sticks of the same length and cut them randomly until all parts became

洛谷——P2383 狗哥玩木棒

https://www.luogu.org/problem/show?pid=2383 题目背景 狗哥又趁着语文课干些无聊的事了... 题目描述 现给出一些木棒长度,那么狗哥能否用给出的木棒(木棒全用完)组成一个正方形呢? 输入输出格式 输入格式: 输入文件中的第一行是一个整数n表示测试的组数,接下来n行表示每组的测试数据. 每行的第一个数为m(4<=m<=20),接下来m个数ai(1<=ai<=1000)表示木棒的长度. 输出格式: 对于每组测试数据,如果可以组成正方形输出“ye

洛谷P3797 妖梦斩木棒

P3797 妖梦斩木棒 题目背景 妖梦是住在白玉楼的半人半灵,拥有使用剑术程度的能力. 题目描述 有一天,妖梦正在练习剑术.地面上摆放了一支非常长的木棒,妖梦把它们切成了等长的n段.现在这个木棒可以看做由三种小段构成,中间的n-2段都是左右都被切断的断头,我们记做’X’,最左边的一段和最右边的一段各有一个圆头,记做’(‘和’)’.幽幽子吃饱后闲来无事,决定戏弄一下妖梦.她拿来了许多这样的三种小段木棒,来替换掉妖梦切下来的n段中的一部分,然后问妖梦一些问题.这些操作可以这样描述: 1 x C 将第