zoukankan      html  css  js  c++  java
  • Codeforces Hello 2018 C

    传送门:http://codeforces.com/contest/913/problem/C

    n类物品,第i(i=0,1,2,...,n-1)类物品的价值为2i,花费为ci。任意选择物品,使得总价值至少为L。求此时的总花费的最小值。(n≤30,L≤109ci109

    这是一个完全背包问题,但是鉴于数据规模,常规的DP是不可取的(TLE+MLE)。

    首先考虑到的是递归地搜索答案。对于当前状态(cur,k),对价值cur做一个简单的划分:商q=cur/vi,余数r=cur%vi。商作为不可继续划分的部分计算花费:qcost=q*vi*ci,对余数继续搜索rcost,状态为(r,i)。对于当前状态,枚举i=k,k-1,...,0,找到最小的qcost+rcost,作为当前状态的返回值。这个做法一定可以得到正确的答案,但是,如此会TLE。

    接下来考虑这个问题的数据是否可以优化。首先考虑c数组:

    首先确定c数组的目标状态。这个目标状态应该满足约束:ci≤ci+12ci

    ci+1≥ci:保证代价c的序列是上升的;

    ci+12ci:保证性价比v/c的序列是上升的。

    于是对于不满足约束的cici+1,则约束之。

    ci=min(ci,ci+1);

    ci+1=min(ci+1,2ci)。

    完成c数组的约束之后,可以简单地求解这个问题了。

    在约束后,由于代价序列是上升的,因此应从价值最小的物品开始考虑;

    由于性价比序列是上升的,因此每一次花费,应获得价值尽可能高的物品。

    于是考虑L的二进制位,设获得第0~i位的物品,对应的总花费为ans(i)。

    则当第i位为0时,不获得物品i,价值0,花费0:ans(i)=ans(i-1);

    当第i位为1时,获得物品i,价值vi,花费cians(i)=ans(i-1)+ci

    有一个例外的情况:当获得更高位的物品i+1所花费的ci+1≤ans(i)时,丢弃0~i位的所有物品,转而获得物品i+1:ans(i)=ci+1

    于是从低位到高位遍历即可。参考程序如下:

    #include <stdio.h>
    #include <stdint.h>
    #define MAX_N 31
    
    const int64_t inf = (int64_t)1e18;
    int64_t c[MAX_N], v[MAX_N];
    int64_t minc[MAX_N];
    
    int64_t min(int64_t a, int64_t b)
    {
        return a < b? a: b;
    }
    
    int main(void)
    {
        int n, l;
        scanf("%d%d", &n, &l);
        for (int i = 0; i < n; i++) {
            scanf("%d", &c[i]);
            if (i) c[i] = min(c[i], 2LL * c[i - 1]);
            if (i) c[i - 1] = min(c[i - 1], c[i]);
            v[i] = 1 << i;
        }
        for (int i = n; i < MAX_N; i++)
            c[i] = 2LL * c[i - 1];
        int64_t ans = 0LL;
        for (int i = 0; i < MAX_N - 1; i++) {
            int p = 1 << i;
            if (l & p) ans += c[i];
            ans = min(ans, c[i + 1]);
        }
        printf("%I64d
    ", ans);
        return 0;
    }
  • 相关阅读:
    线程之同步函数
    selenium破解极验验证
    数据结构--树
    数据结构--线性表
    数据结构--栈
    数据结构--队列
    代理的初步理解
    javamail+ical4j发送会议提醒
    阿里云学习之IOT物联网套件(客户端与服务端的后台数据传输)
    位图数据结构原理分析总结
  • 原文地址:https://www.cnblogs.com/siuginhung/p/8251399.html
Copyright © 2011-2022 走看看