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 }
越努力,越幸运