HD-ACM算法专攻系列(21)——Wooden Sticks
题目描述:
AC源码:
此题考查贪心算法,解题思路:首先使用快速排序,以w或l按升序排序(注意相等时,应按另一值升序排序),这样就将二维变量比较,变为了一维的,排好序的一边就不需要去管了,只需要对未排序的一边直接进行贪心遍历。时间复杂度O(n^2)
#include"iostream" #include"algorithm" using namespace std; struct Stick { int l; int w; bool processed; }; bool cmp(Stick a, Stick b) { if(a.l < b.l) { return true; } else if(a.l == b.l) { return a.w < b.w; } else { return false; } } int main() { int t, n, total, val; Stick s[5000]; scanf("%d", &t); for(int i = 0; i < t; i++) { scanf("%d", &n); total = 0; for(int j = 0; j < n; j++) { scanf("%d %d", &s[j].l, &s[j].w); s[j].processed = false; } sort(s, s+n, cmp); for(int j = 0; j < n; j++) { if(!s[j].processed) { total++; val = s[j].w; s[j].processed = true; for(int k = j + 1; k < n; k++) { if(!s[k].processed && s[k].w >= val) { val = s[k].w; s[k].processed = true; } } } } printf("%d\n", total); } return 0; }