hdu1051 Wooden Sticks---贪心

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1051

题目大意:
给你n根木棍的长度和重量。根据要求求出制作该木棍的最短时间。建立第一个木棍需要1分钟,如果接着制作的木棍比这个木棍的长度长(或者相等),重量要重(或者相等),那么接着制作的木棍不需要花费时间!然后如果再继续接着制作,则下一个木棍要比上一个木棍的长度长(或者相等),重量大(或者相等),则这个木棍也不需要花费时间!依次类推,反之,则需要花费一分钟,然后让你求出制作这一批木棍花费的最少的时间是多少!

解题思路:

排序,贪心,按照长度从小到大排序,长度相同质量从小到大排序,每次取最小的木棍,从小到大扫描一遍并标记,然后继续取未标记的最小的木棍,以此类推,每次取最小的木棍时,时间加一就得到结果了。

 

 1 #include<iostream>
 2 #include<string>
 3 #include<vector>
 4 #include<cstdio>
 5 #include<cstring>
 6 #include<algorithm>
 7 #define FOR(i, a, b) for(int i = a; i < b; i++)
 8 using namespace std;
 9 int n, T;
10 struct node
11 {
12     int l, w;
13     bool operator < (const node & a)const
14     {
15         return l < a.l || l == a.l && w < a.w; 
16     }
17 };
18 const int maxn = 5005 ;
19 node a[maxn];
20 bool vis[maxn];
21 bool f(node a, node b)//判断a<b是否成立
22 {
23     return (a.l <= b.l && a.w <= b.w);
24 } 
25 int main()
26 {    
27     cin >> T;
28     while(T--)
29     {
30         cin >> n;
31         for(int i = 0; i < n; i++)
32         {
33             cin >> a[i].l >> a[i].w;
34             vis[i] = 0;
35         }
36         sort(a, a + n);//排序 
37         int ans = 0;
38         for(int i = 0; i < n; i++)
39         {
40             if(vis[i])continue;//如果已经标记过的,直接下一个 
41             vis[i] = 1;
42             node now = a[i];//设置当前小的木棍,找到一个比它大的,更新当前木棍 
43             for(int j = i + 1; j < n; j++)
44             {
45                 if(vis[j])continue;
46                 if(f(now, a[j]))
47                 {
48                     vis[j] = 1;
49                     now = a[j];
50                  }
51             }
52             ans++;
53         }
54         cout<<ans<<endl;
55     }
56     return 0;
57 }

 

posted @ 2018-03-30 13:43  _努力努力再努力x  阅读(135)  评论(0编辑  收藏  举报