zoukankan      html  css  js  c++  java
  • 木棒问题

    问题 H: 木棒

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

    题目描述

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

    输入

    输入包含多组测试数据。输入的第一行是一个整数T,表示测试数据的个数。
    每个测试例两行:
    第一行是一个整数n1<=n<=5000),表示有多少根木棒;
    第二行包括n*2个整数,表示了l1w1l2w2l3w3...lnwn,这些数均不大于10000,其中liwi表示第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
    ", h);
            }
        }
        return 0;
    }
  • 相关阅读:
    分析NGINX 健康检查和负载均衡机制
    基于ASIO的协程库orchid简介
    基于ASIO的协程与网络编程
    Boost.Asio技术文档
    Linux升级命令yum upgrade和yum update的区别
    yum和apt-get的用法和区别
    Linux-centos7设置静态IP地址
    Linux-各种姿势(lessvi等)打开各种类型的文件(txt/csv/xlsx等)出现不能打开(全乱码、部分乱码、二进制文件等)的问题
    Excel-vlookup(查找值,区域范围,列序号,0)如何固定住列序列号,这样即使区域范围变动也不受影响
    EXCEL-名称管理器
  • 原文地址:https://www.cnblogs.com/didideblog/p/7224925.html
Copyright © 2011-2022 走看看