zoukankan      html  css  js  c++  java
  • noip模拟赛 abcd

    【问题描述】
    有4个长度为N的数组a,b,c,d。现在需要你选择N个数构成数组e,数组e满足
    a[i]≤e[i]≤b[i]以及


    并且使得


    最大。
    【输入格式】
    输入文件名为abcd.in。
    输入文件共 N+1 行。
    第 1 行包含1个正整数N。
    第 i+1 行包含4个整数a[i],b[i],c[i],d[i]。
    【输出格式】
    输出文件名为abcd.out。
    输出共1行,包含1个整数,表示所给出公式的最大值。输入数据保证一定有
    解。
    【输入输出样例1】

    abcd.in abcd.out
    5 -
    1 1 2 5
    -2 2 1 2
    0 1 1 3
    -2 -1 3 10
    -2 2 3 9
    2


    【输入输出样例2】

    abcd.in abcd.out
    10
    1 10 1 7
    -10 10 2 0
    -10 10 2 2
    -10 10 2 0
    1 10 1 0
    -10 10 2 0
    90

    分析:比较容易看出来这是一道多重背包的题.但是朴素做法肯定过不了,需要优化.比较常见的优化是二进制法和单调队列.这道题用二进制法比较好处理.

          由于[ai,bi]中可能包含负数,所以需要对式子变形.

         [ai,bi] ---> [0,bi-ai] + ai = ei.  Σei*ci = 0,因为要让背包的容积是最大的,所以ei取bi-ai,那么Σei*ci = 0 ---> Σ(bi - ai)*ci + ai*ci = 0,移项,可以得到背包的容积为-Σai*ci.要最大化Σei*di ---> Σ(bi-ai)*di + ai*di.

         这样变形后,ei的取值范围就变成了[0,bi-ai],就可以分解成二进制数来做了.

    #include <cstdio>
    #include <queue>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    int n, a[210], b[210], c[210], d[210], m,f[210000], ans, v[210000], w[210000], cnt;
    
    void init(int num, int x, int y)
    {
        for (int i = 1; i <= num; i *= 2)
        {
            v[++cnt] = x * i;
            w[cnt] = y * i;
            num -= i;
        }
        if (num)
        {
            v[++cnt] = x * num;
            w[cnt] = y * num;
        }
    }
    
    int main()
    {
        memset(f, -127 / 3, sizeof(f));
        f[0] = 0;
        scanf("%d", &n);
        for (int i = 1; i <= n; i++)
        {
            scanf("%d%d%d%d", &a[i], &b[i], &c[i], &d[i]);
            m -= a[i] * c[i];
            b[i] -= a[i];
            ans += a[i] * d[i];
        }
        for (int i = 1; i <= n; i++)
            init(b[i], c[i], d[i]);
        for (int i = 1; i <= cnt; i++)
            for (int j = m; j >= v[i]; j--)
                f[j] = max(f[j], f[j - v[i]] + w[i]);
        printf("%d
    ", ans + f[m]);
    return 0;
    }
  • 相关阅读:
    mongodb 报错问题
    Android中Is library配置的作用
    Ubuntu 12.04 中安装和配置 Java JDK
    (转)Android开发把项目打包成apk
    (转)Android--使用Canvas绘图
    Android_Gallery(画廊)
    android组件
    Android中px dpi dip density densityDpi 的相关说明
    (转)Android中px与dip,sp与dip等的转换工具类
    (转)谈谈Android中的Rect类——奇葩的思维
  • 原文地址:https://www.cnblogs.com/zbtrs/p/7750669.html
Copyright © 2011-2022 走看看