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。

  这题比较简单,我把样例数据测试过了就提交了,然后就AC了。

  代码链接: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 }
时间: 2024-10-12 10:45:47

ZOJ Problem Set - 1025解题报告的相关文章

ZOJ Monthly, June 2014 解题报告

A.Another Recurrence Sequence B.Gears 题目大意:有n个齿轮,一开始各自为一组,之后进行m次操作,包括以下4种类型: 1.合并两组齿轮,合并的两个应该反向旋转 2.把某个齿轮从所在组删除,自为一组,但不影响同组其它齿轮的状态与关系 3.询问两个齿轮是同向.反向或无关系(即不在同一组) 4.询问某个齿轮所在组的齿轮总数 分析:典型的并查集操作,但是注意两点: 1.由于操作3要询问两个齿轮的相对状态,因此对并查集中每个元素应当保存它的状态信息.状态是相对的,只需要

Problem - 433C - Codeforces解题报告

对于这题本人刚开始的时候的想法是:先把最大两数差的位置找到然后merge计算一个值再与一连串相同的数做merge后计算一个值比较取最大值输出:可提交后发现不对,于是本人就搜了一下正解发现原来这题的正确解题思路是:采用数学中的中位数原理,分别把某数两边相邻且不同的数存入向量容器Vector中然后排序,找到中位数计算一遍,找到计算的最大值,然后把按照输入顺序的值计算出一个总和,然后相减就是其解. 关于中位数原理本人稍微提一下: 求中位数,首先要先进行数据的排序(从小到大),然后计算中位数的序号,分数

BestCoder18 1002.Math Problem(hdu 5105) 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5105 题目意思:给出一个6个实数:a, b, c, d, l, r.通过在[l, r]中取数 x,使得这个函数 f(x)= |a∗x3+b∗x2+c∗x+d| 最大. 我一开始做的时候,很天真的认为数据量这么小,一个一个试,暴力搜就肯定能得到答案啦.但是一个很严重的问题是,x 没有说是实数还是整数,所以枚举根本不可行. 于是就联想到应该使用高中求一元三次方程的方法来做.我当时是直接从 f(l), f

Problem A: 种树 解题报告

Problem A: 种树 Description 很久很久以前,一个蒟蒻种了一棵会提问的树,树有\(n\)个节点,每个节点有一个权值,现在树给出\(m\)组询问,每次询问两个值:树上一组点对\((x,y)\)简单路径上不同权值的数量以及权值的\(\max\)为多少 然而某一天毒瘤胖子过来给树浇了点水,询问变成了每次求,一组点对\((x,y)\)简单路径上的不同权值的数量以及权值的\(mex\) 然而又过了两天毒瘤袁稳稳也过来给树浇了点水,询问变成了每次求若干组点对\((x,y)\)简单路径的并

POJ 3468.A Simple Problem with Integers 解题报告

用树状数组和线段树会比较简单,这里用这道题来学习Splay. 第一次写,代码比较丑 /* 初始化添加一个key值足够大的结点 保证每个需要的结点都有后继 */ #include <iostream> #include <cstdio> #define ll long long using namespace std; const int MAXN = 1111111, INF = 0x7fffffff; struct node { //需要的记录信息 ll key, val, su

zoj 2316 Matrix Multiplication 解题报告

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2316 题目意思:有 N 个 点,M 条 边.需要构造一个N * M 大小的矩阵A.对于 (i, j) 这个坐标点它表示,对编号为 i 这个点编号为 j 的 点与它相连,此时标记(i, j) 为1,如果坐标点没有跟这条 j 的边相连,就标记为0.构造完这个矩阵A之后,需要求出它的转置矩阵AT,算出 ATA 的和. 新学期第一场比赛!刚开始真是打算直接做的,但是数据

XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Khamovniki Problem J Stairways解题报告(分块+维护凸壳)

首先ORZ一发Claris聚聚的题解:http://www.cnblogs.com/clrs97/p/8689215.html,不然我可能没机会补过这道神题了. 这里写一个更详细的题解吧(我还是太菜了啊). 题目描述 有\(n(n \le10^5)\)个人依次进入一个入口,要到一个出口.入口到出口有两条同样长的路.每个人都有一个速度,用通行时间\(a_i(1\le a_i \le 10^6)\)表示,他可以选择任一条路走.但是,若走这条路的前面的人比他慢的话,他只能降到和前面所有人最慢的那个人同

ZOJ 3706 Break Standard Weight 解题报告

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5009 题目意思:给出两个mass:x 和 y,问如何将其中一个 mass 一分为二(当然分完之后它们的和要等于原来的mass,或x 或 y),使得利用这三个mass 可称的数量最大.输出这个最大数量. 网上参考别人用STL中的set来写,太厉害了!!!考虑到set对于重复的元素只存储一个,那么当三个mass组合的过程中有重复的,它都会自动舍弃有重复的,不需要用if来

zoj 2313 Chinese Girls&#39; Amusement 解题报告

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1313 题目意思:有 N 个人(编号依次为1~N)围成一个圆圈,要求求出最大的 K (1 ≤ K ≤ N/2),表示从编号为1的人开始,将球传递给他后一个人数起的第K个人,第K个人又传递给往后数的第K个人......要求这样传递下去,且每个人都有机会接到球.也就是不存在当未使得全部人都接到一次球的情况下,某个人接收到两次以上的球. 详细的解题报告在这里: http:/