POJ1065---Wooden Sticks

来源:互联网 发布:淘宝上卖的假索尼电视 编辑:程序博客网 时间:2024/05/19 09:12

题目大意:给出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;}
0 0
原创粉丝点击