poj 1065 最长上升子序列

来源:互联网 发布:淘宝购物券是什么 编辑:程序博客网 时间:2024/06/15 19:44

题意:

有n支木棍,每只木棍有一个长度 l 和 重量 w。

每次处理第一只木根的时候要消耗 1 的时间,紧接其后的木棍们,若满足 l 和 w 都大于当前的木棍,可以不用消耗时间。

问在这样的条件下,合理安排木棍处理顺序,时间最小是多少。


解析:

先间 l 从小到大排序,然后求 w 的上升子序列,每次求完标记就行了。


代码:

#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>#include <set>#include <climits>#include <cassert>#define LL long long#define lson lo, mi, rt << 1#define rson mi + 1, hi, rt << 1 | 1using namespace std;const int maxn = 5000 + 10;const int inf = 0x3f3f3f3f;const double eps = 1e-8;const double pi = acos(-1.0);const double ee = exp(1.0);struct Machine{    int l, w;    bool operator < (const Machine a) const    {        if (l == a.l)            return w < a.w;        return l < a.l;    }} mac[maxn];bool vis[maxn];int main(){#ifdef LOCAL    freopen("in.txt", "r", stdin);#endif // LOCAL    int ncase;    scanf("%d", &ncase);    while (ncase--)    {        memset(vis, false, sizeof(vis));        int n;        scanf("%d", &n);        for (int i = 0; i < n; i++)        {            scanf("%d%d", &mac[i].l, &mac[i].w);        }        sort(mac, mac + n);        int ans = 0;        for (int i = 0; i < n; i++)        {            int lastW = mac[i].w;            if (!vis[i])            {                for (int j = i + 1; j < n; j++)                {                    if (!vis[j])                    {                        if (lastW <= mac[j].w)                        {                            vis[j] = true;                            lastW = mac[j].w;                        }                    }                }                ans++;            }        }        printf("%d\n", ans);    }    return 0;}


0 0
原创粉丝点击