博客
关于我
BZOJ1597 & 洛谷2900:[USACO2008 MAR]Land Acquisition 土地购买——题解
阅读量:796 次
发布时间:2023-03-24

本文共 2027 字,大约阅读时间需要 6 分钟。

约翰想要购买N块长方形土地,每块土地单独购买的费用是其面积。他可以将土地分成若干组并购,每组的价格是该组中最长的长乘以最宽的宽。目标是找到所有土地分组后的最小总费用。

方法思路

为了最小化购买土地的费用,约翰可以将土地分成若干组进行并购。每组的价格是该组中最长的长乘以最宽的宽。为了找到最优的分组方式,可以使用动态规划和单调队列来优化计算过程。

  • 排序土地:首先将所有土地按照长降序、宽升序排序。这样可以确保每块土地与前面的土地组合时,长和宽的变化具有单调性,便于后续的优化处理。
  • 动态规划状态转移:定义dp[i]表示处理前i块土地的最小费用。状态转移方程为dp[i] = min(dp[j] + a[j+1].l * a[i].w),其中j < i。
  • 单调队列优化:为了优化动态规划的O(n²)时间复杂度,使用单调队列来维护可能的候选j。通过计算g值来判断当前状态是否需要被剪枝,从而维护队列的单调性。
  • 剪枝处理:在队列中,前面的元素可能有多个候选,只需要取最优的一个;后面的元素可能会被更优的j替代,需要通过g值来剪枝。
  • 解决代码

    #include 
    #include
    #include
    #include
    #include
    using namespace std;
    typedef struct {
    long long l, w;
    } Land;
    int read() {
    int X = 0, w = 1;
    while (w != 1 && (X < 0 || !isdigit((unsigned char)ch))) {
    if (ch == '-') w = -1;
    ch = getchar();
    }
    while (isdigit((unsigned char)ch)) {
    X = (X < 0) ? (X < -9 ? -1000000000 : -1000000000) : (X >= 1000000000 ? 1000000000 : X + 10);
    ch = getchar();
    }
    return X * w;
    }
    int main() {
    int n = read();
    Land a[1];
    for (int i = 1; i <= n; ++i) {
    a[i].l = read();
    a[i].w = read();
    }
    sort(a + 1, a + n + 1, [](Land a, Land b) {
    if (a.l != b.l) return a.l > b.l;
    return a.w > b.w;
    });
    int cnt = 0;
    int maxw = 0;
    for (int i = 1; i <= n; ++i) {
    if (a[i].w > maxw) {
    maxw = a[i].w;
    cnt++;
    b[cnt].l = a[i].l;
    b[cnt].w = a[i].w;
    }
    }
    int l = 1, r = 1;
    for (int i = 1; i <= cnt; ++i) {
    while (l < r && suan(q[l], q[l + 1]) < b[i].w) {
    l++;
    }
    q[l] = i;
    f[i] = f[q[l]] + b[q[l] + 1].l * b[i].w;
    while (l < r && suan(q[r], i) >= b[i].w) {
    r--;
    }
    }
    cout << f[cnt] << endl;
    }

    代码解释

  • 读取输入:使用read函数读取输入数据,处理负数和大数情况。
  • 排序土地:将土地按长降序、宽升序排序,确保单调性。
  • 单调队列初始化:初始化单调队列和动态规划数组。
  • 状态转移优化:使用单调队列维护候选j,通过计算g值来剪枝不优的状态。
  • 计算最小费用:遍历土地,更新动态规划数组,计算最终的最小购买费用。
  • 这种方法通过动态规划和单调队列优化,能够在较短时间内找到最优的土地分组方案,帮助约翰节省购买土地的费用。

    转载地址:http://qeqfk.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现SinglyLinkedList单链表算法(附完整源码)
    查看>>
    Objective-C实现skew heap倾斜堆算法(附完整源码)
    查看>>
    Objective-C实现Skip List跳表算法(附完整源码)
    查看>>
    Objective-C实现slack message松弛消息算法(附完整源码)
    查看>>
    Objective-C实现slow sort慢排序算法(附完整源码)
    查看>>
    Objective-C实现tanh函数功能(附完整源码)
    查看>>
    Objective-C实现z-algorithm算法(附完整源码)
    查看>>
    Objective-C实现zellers congruence泽勒一致算法(附完整源码)
    查看>>
    Objective-C实现Zero One Knapsack零一背包计算算法(附完整源码)
    查看>>
    Objective-C实现一个Pangram字符串至少包含一次所有字母算法(附完整源码)
    查看>>
    Objective-C实现一个通用的堆算法(附完整源码)
    查看>>
    Objective-C实现一分钟倒计时(附完整源码)
    查看>>
    Objective-C实现三次样条曲线(附完整源码)
    查看>>
    Objective-C实现上传文件到FTP服务器(附完整源码)
    查看>>
    Objective-C实现两数之和问题(附完整源码)
    查看>>
    Objective-C实现串口通讯(附完整源码)
    查看>>
    Objective-C实现串逐位和(附完整源码)
    查看>>
    Objective-C实现主存储器空间的分配和回收(附完整源码)
    查看>>
    Objective-C实现乘方运算---m的n次方(附完整源码)
    查看>>
    Objective-C实现二叉树遍历算法(附完整源码)
    查看>>