• 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 }
  • 相关阅读:
    golang map的判断,删除
    Golang 嵌套map赋值办法
    Android 手势锁的实现 让自己的应用更加安全吧
    HTML5 CSS3 诱人的实例 : 网页加载进度条的实现,下载进度条等
    MyEclipse代码提示设置
    Linux内核参数优化
    CDH配置使用介绍
    Hadoop Hive HBase调优
    Redis数据类型
    Redis性能问题排查解决手册
  • 原文地址:https://www.cnblogs.com/GodA/p/5237013.html
Copyright © 2020-2023  润新知