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