• 木棒


    题目描述

    现有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




    题意描述:

           输入n(1<=n<=5000)表示木棒数,接着输入n对数表示该木棒的长度l和质量w(均不大于10000)

    计算并输出加工完这些木棒所需要的最少加工时间

       解题思路:

            刚开始以为以第一根最小的木棒为参照,一直到做完满足这个参照的木棒,最后才发现参照木棒是需要变换的,相当于求该串数有几个上升序列。

            先将该串数存为结构体数组(成员分别有长度l,重量w,是否加工过标志z),排序,for循环用长度相对最小的那根木棒为参照,找到满足条件的最近的木棒,变换参照,

    继续往后加工,直到加工完满足条件的,每次开头计数变量c加1,最后输出即可。

    代码实现:

     1 #include<stdio.h>
     2 #include<algorithm>
     3 using namespace std;
     4 struct m
     5 {
     6     int l,w,z;
     7 };
     8 bool cmp(struct m  x,struct m  y)
     9 {
    10     if(x.l<y.l)
    11     return true;
    12     else if(x.l==y.l)
    13     {
    14         if(x.w<y.w)
    15         return true;
    16         else
    17         return false;
    18     }
    19     else
    20     return false;
    21 }
    22 
    23 int main()
    24 {
    25     int t,n,i,c,j,l,w;
    26     struct m b[5001];
    27     scanf("%d",&t);
    28     while(t--)
    29     {
    30         scanf("%d",&n);
    31         for(i=0;i<n;i++)
    32             scanf("%d%d",&b[i].l,&b[i].w);
    33         sort(b,b+n,cmp);
    34         for(i=0;i<n;i++)
    35             b[i].z=0;//均初始化为0,表示未加工过 
    36         for(c=0,i=0;i<n;i++)
    37         {
    38             if(b[i].z==0)
    39             {
    40                 b[i].z=1;
    41                 c++;
    42                 l=b[i].l;
    43                 w=b[i].w;
    44                 for(j=0;j<n;j++)
    45                 {
    46                     if(b[j].z==0&&b[j].l>=l&&b[j].w>=w)
    47                     {
    48                         b[j].z=1;
    49                         l=b[j].l;
    50                         w=b[j].w;    
    51                     }
    52                 }
    53             }
    54         }
    55         printf("%d
    ",c);
    56     }
    57     return 0;
    58 }

    易错分析:

    注意分析题意,细心读题

    测试样例:

    3

    5

    1 1

    1 1

    1 2

    2 1

    2 2

    3

    3 3

    3 3

    2 2

    3

    1 2

    1 1 

    2  2

    样例输出:

    1

    1

  • 相关阅读:
    二分法排序
    GDB调试命令
    X264编译
    ffmpeg编译
    css-icons
    Javascript组成--ECMAScript,DOM,BOM
    9 Utils
    8 移动端填坑
    7 媒体查询( Media Queries )
    css3--rem
  • 原文地址:https://www.cnblogs.com/wenzhixin/p/7225081.html
Copyright © 2020-2023  润新知