zoukankan      html  css  js  c++  java
  • ZOJ Problem Set 1025解题报告

      ZOJ Problem Set - 1025

      题目分类:基础题

      原题地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1025

        题目大意就是有很多木头,都有各自的长度和重量。现在要加工这些木头,如果加工某根木头的长度和重量大于等于它上一根木头的长度和重量,那么加工它不需要时 间,否则要花1分钟。现给出一堆木头的长度和重量,要求加工完这堆木头可以花的最少时间。例如给出5根木头长度重量分别为(4,9), (5,2), (2,1), (3,5),(1,4),那么最优加工顺序是(1,4), (3,5), (4,9), (2,1), (5,2),只需要花两分钟。

      解题思路:刚看完题目我觉得有点像上升序列。这题可以先排序,按照长度排序,长度相同的按重量排。然后按照以下的步骤即可求出答案。

      (1)找到第 i 趟(i∈[1,n])第一个可加工的木头,向后遍历,把可以在这一趟中不花时间的标记为已加工,并记录已加工的件数。

      (2)若件数小于木头总数n,则返回(1),否则进入(3)。

      (3)输出最短时间即遍历趟数 i。

      代码链接:http://paste.ubuntu.com/15263595/

     1 #include <iostream>
     2 using namespace std;
     3 
     4 struct stick
     5 {
     6     int len;
     7     int wei;
     8     int made;
     9 };
    10 int main()
    11 {
    12     int T,n,i,j,nowlen,nowwei,count,time;
    13     stick w[5000],t;
    14     cin>>T;
    15     while(T)
    16     {
    17         cin>>n;
    18         if(n == 1)
    19         {
    20             cout<<"1"<<endl;
    21             T--;
    22             continue;
    23         }
    24         for(i=0;i<n;i++)
    25         {
    26             cin>>w[i].len>>w[i].wei;
    27             w[i].made = 1;              // 1表示可以加工,0表示已加工
    28         }
    29         for(i=0;i<n-1;i++)                //排序
    30         {
    31             for(j=i+1;j>0;j--)
    32             {
    33                 if(w[j].len < w[j-1].len || (w[j].len == w[j].len && w[j].wei < w[j].wei))
    34                 {
    35                     t = w[j];
    36                     w[j] = w[j-1];
    37                     w[j-1] = t;
    38                 }
    39             }
    40         }
    41         count = 0;        
    42         time = 0;
    43         while(count < n)            //count记录已加工的件数
    44         {
    45             for(i=0;i<n;i++)        //记录每趟遍历的第一个可加工的木头
    46             {
    47                 if(w[i].made)
    48                 {
    49                     nowlen = w[i].len;
    50                     nowwei = w[i].wei;
    51                     break;
    52                 }
    53             }
    54             for(i=0;i<n;i++)        //每趟遍历把可以不花时间的标记为已加工
    55             {
    56                 if(w[i].len >= nowlen && w[i].wei >= nowwei && w[i].made)
    57                 {
    58                     nowlen = w[i].len;
    59                     nowwei = w[i].wei;
    60                     w[i].made = 0;
    61                     count++;
    62 
    63                 }
    64             }
    65             time++;
    66         }
    67         cout<<time<<endl;
    68         T--;
    69     }
    70 }
  • 相关阅读:
    Maven 环境的配置
    zTree的简单例子
    plsql免安装客户端的配置
    HDU 1232 畅通工程
    HDU 5698 瞬间移动
    Codeforces 1015E1 Stars Drawing (Easy Edition)
    Codeforces 784B Santa Claus and Keyboard Check
    Codeforces 500C New Year Book Reading
    NSarray 赋值 拷贝 等问题记录
    UINavigationController 操作记录
  • 原文地址:https://www.cnblogs.com/GodA/p/5237013.html
Copyright © 2011-2022 走看看