8.4.1 最优装载问题

8.4.2 部分背包问题

按照比值计算

8.4.3 乘船问题

这个题目应该先拍好序吧= =

8.4.4 选择不相交区间

长度方面选短的,优先选靠前的。

c#include <stdio.h>
#include <algorithm>

using namespace std;

struct interval
{
    int a, b;
};

int cmp(interval a, interval b)
{
    return a.a < b.a;
}

const int MAXN = 10000;
const int INF = 10000000;

int main(int argc, const char *argv[])
{
    interval a[MAXN];
    int n;
    while(~scanf("%d", &n))
    {
        for(int i = 0; i < n; i++)
            scanf("%d%d",  &a[i].a, &a[i].b);
        sort(a, a+n, cmp);

        // for(int i = 0; i < n; i++)
        // printf("%d %d\n", a[i].a, a[i].b);

        int pre = 0,cnt = 1;
        for(int i = 1 ; i < n; i++)
        {
            if(a[pre].b > a[i].b) pre = i; 
            if(a[i].a > a[pre].b)
            {
                cnt ++;
                pre = i;
            }
        }

        printf("%d\n", cnt);
    }
    return 0;
}

8.4.5 区间选点问题

选最头上的点。。

c#include <stdio.h>
#include <algorithm>

using namespace std;

struct interval
{
    int a, b;
};

int cmp(interval a, interval b)
{
    if(a.b != b.b)
        return a.b < b.b;
    return a.a > b.a;
}

const int MAXN = 10000;
const int INF = 10000000;

int main(int argc, const char *argv[])
{
    interval a[MAXN];
    int n;
    while(~scanf("%d", &n))
    {
        for(int i = 0; i < n; i++)
            scanf("%d%d",  &a[i].a, &a[i].b);
        sort(a, a+n, cmp);
        // scanf("%d%d", &s, &t);


        // for(int i = 0; i < n; i++)
        // printf("%d %d\n", a[i].a, a[i].b);

        int cnt = 1;
        int pre = a[0].b;
        for(int i = 1; i < n; i++)
        {
            if(pre < a[i].a)
            {
                cnt++;
                pre = a[i].b;
            }
        }

        printf("%d\n", cnt);
    }
    return 0;
}

8.4.6 区间覆盖问题

优先选覆盖较长的区间...

c#include <stdio.h>
#include <algorithm>

using namespace std;

struct interval
{
    int a, b;
};

int cmp(interval a, interval b)
{
    return a.a < b.a;
}

const int MAXN = 10000;
const int INF = 10000000;

int main(int argc, const char *argv[])
{
    interval a[MAXN];
    int n, s, t;
    freopen("input", "r", stdin);
    while(~scanf("%d", &n))
    {
        for(int i = 0; i < n; i++)
            scanf("%d%d",  &a[i].a, &a[i].b);
        sort(a, a+n, cmp);
        scanf("%d%d", &s, &t);


        for(int i = 0; i < n; i++)
            printf("%d %d\n", a[i].a, a[i].b);

        int cnt = 1;
        int pre;
        if(a[0].a < s)
            pre = a[0].b;
        else
        {
            puts("-1");
            continue;
        }

        for(int i = 1; i < n; i++)
        {
            if(a[i].a > s)
            { 
                cnt++;
                s = pre;
            }

            if(a[i].a <= s && pre < a[i].b)
                pre = a[i].b;

            if(pre >= t)
                break;
        }

        if(pre >= t)
            printf("%d\n", cnt);
        else 
            puts("-1");
    }
    return 0;
}

8.4.7 哈夫曼编码


svtter
209 声望37 粉丝

更喜欢原型开发


引用和评论

0 条评论