POJ1065---Wooden Sticks

题目大意:给出n根木棒,每个木棒都有自己的长度和重量,求不下降子序列的最小个数,后一个木棒的长度和重量都要大于等于前一个
分析:贪心+动态规划

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

struct stick{
    int l, w;
};
stick c[5005];
int use[5005], ans;

bool cmp(stick i, stick j) {
    if(i.l == j.l) return i.w < j.w;
    else return i.l < j.l;
}

int main() {
    int kase;
    scanf("%d", &kase);
    while(kase--) {
        int n;
        scanf("%d", &n);
        for(int i = 0; i < n; i++)
            scanf("%d%d", &c[i].l, &c[i].w);
        sort(c, c+n, cmp);    //先按长度进行排序,若相等,重量小的排前面
        ans = 0;
        memset(use, 0, sizeof(use));
        for(int i = 0; i < n; i++) {
            if(!use[i]) {
                stick last;
                last.w = c[i].w;
                for(int j = i + 1; j < n; j++) {
                    if(!use[j] && last.w <= c[j].w) {    //由于长度已经排序好,只需判断后一个木棒的重量以及是否使用过
                        use[j] = 1;
                        last.w = c[j].w;
                    }
                }
                ans++;
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}

你可能感兴趣的:(poj)